27 个版本

0.7.0-rc22023 年 8 月 15 日
0.7.0-rc12023 年 1 月 22 日
0.6.4 2023 年 1 月 21 日
0.6.3 2022 年 10 月 21 日
0.1.2 2018 年 2 月 6 日

972Unix API

Download history 99237/week @ 2024-04-22 77294/week @ 2024-04-29 88091/week @ 2024-05-06 90501/week @ 2024-05-13 84450/week @ 2024-05-20 75510/week @ 2024-05-27 79315/week @ 2024-06-03 75921/week @ 2024-06-10 79788/week @ 2024-06-17 80676/week @ 2024-06-24 73683/week @ 2024-07-01 89061/week @ 2024-07-08 83835/week @ 2024-07-15 86369/week @ 2024-07-22 84853/week @ 2024-07-29 78904/week @ 2024-08-05

337,878 每月下载量
用于 152 个 crate (17 个直接使用)

BSD-3-Clause

230KB
5K SLoC

Latest Version Documentation

neli

Rust 的类型安全 netlink 库

从版本 0.4.0 开始,自动生成文档和示例的完整性将成为重点。如果有缺失或不确定的地方,请提出问题!

API 文档

API 文档可以在 这里 找到

目标

这个库旨在尽可能覆盖 netlink 子系统,并为任何不在该库支持范围内的功能提供扩展 neli 的方法。

这也是一个纯 Rust 实现,旨在利用 Rust 的惯用法特性。

使用 neli 的示例

在 Github 的 examples/ 子目录中有可工作代码的示例。运行 cargo build --examples 来构建示例。

工作流程通常遵循创建套接字、然后发送和接收请求/响应格式中的消息的模式

use std::error::Error;

use neli::{
    consts::{genl::*, nl::*, socket::*},
    err::RouterError,
    genl::{Genlmsghdr, GenlmsghdrBuilder, Nlattr},
    nl::{NlmsghdrBuilder, NlPayload},
    router::synchronous::NlRouter,
    types::{Buffer, GenlBuffer},
    utils::Groups,
};

const GENL_VERSION: u8 = 1;

fn request_response() -> Result<(), Box<dyn Error>> {
    let (socket, _) = NlRouter::connect(
        NlFamily::Generic,
        None,
        Groups::empty(),
    )?;

    let recv = socket.send::<_, _, NlTypeWrapper, Genlmsghdr<CtrlCmd, CtrlAttr>>(
        GenlId::Ctrl,
        NlmF::DUMP,
        NlPayload::Payload(
            GenlmsghdrBuilder::<_, CtrlAttr, _>::default()
                .cmd(CtrlCmd::Getfamily)
                .version(GENL_VERSION)
                .build()?
        ),
    )?;
    
    for msg in recv {
        let msg = msg?;
        // Do things with response here...
    }
    
    Ok(())
}

或者订阅 netlink 的事件通知流

use std::error::Error;

use neli::{
    consts::{genl::*, nl::*, socket::*},
    err::RouterError,
    genl::Genlmsghdr,
    router::synchronous::NlRouter,
    utils::Groups,
};

fn subscribe_to_mcast() -> Result<(), Box<dyn Error>> {
    let (s, multicast) = NlRouter::connect(
        NlFamily::Generic,
        None,
        Groups::empty(),
    )?;
    let id = s.resolve_nl_mcast_group(
        "my_family_name",
        "my_multicast_group_name",
    )?;
    s.add_mcast_membership(Groups::new_groups(&[id]))?;
    for next in multicast {
        // Do stuff here with parsed packets...
    
        // like printing a debug representation of them:
        println!("{:?}", next?);
    }

    Ok(())
}

贡献

您的贡献将根据 neli 的 许可证 进行许可。我希望尽可能简单,所以在贡献之前请阅读许可证文件,确保您对在 BSD 3-Clause 许可证下发布贡献感到舒适。

wherever possible,请为新功能添加测试。如果我看到有缺失,我可能会在合并前要求这么做。

请不仅在新功能的高级层面,而且还要在模块的 //! 注释中记录新功能,以提供高级文档和功能概述。

在提交PR之前,请查看你正在更改的模块的文档。我目前正在为每个模块添加一个“设计决策”部分。如果你想知道为什么我以这种方式做某事,它应该在那里。这样,如果你有更好的方法,请告诉我!我总是乐于学习。我的希望是这也能在事前澄清一些关于为什么我这样做的问题,并使你的贡献者生活更容易。

Git钩子

我提供了Git钩子来模拟CI运行的一部分。如果你想启用这些,它们可能会在查看CI之前捕获一些错误。如果你想启用这些,请运行 git config core.hookspath .githooks。你的提交会在创建提交之前进行检查。

PR目标分支

PR步骤

  • 对于非破坏性的错误修复和改进,请针对 main
  • 对于破坏性变更,请针对下一个版本发布分支 - 这看起来像 v[NEXT_VERSION]-dev
  • 请将你的更改的简要描述包括在CHANGELOG文件中
  • 一旦PR被审查并批准,请将其rebase到目标分支
    • 对于不太熟悉git的人,它可能看起来像这样
      • gitrebase[TARGET_BRANCH] [YOUR_BRANCH]
      • 这是一个破坏性操作,所以在做之前请务必仔细检查git push -f origin [YOUR_BRANCH]

依赖关系

~2–11MB
~121K SLoC