6个版本

0.3.3 2023年7月10日
0.3.2 2023年1月29日
0.3.1 2022年6月23日
0.3.0 2021年12月29日
0.1.0 2021年9月21日

#2 in #family

Download history 2481/week @ 2024-03-14 2919/week @ 2024-03-21 2005/week @ 2024-03-28 2122/week @ 2024-04-04 2031/week @ 2024-04-11 1903/week @ 2024-04-18 1811/week @ 2024-04-25 2656/week @ 2024-05-02 2141/week @ 2024-05-09 2684/week @ 2024-05-16 2011/week @ 2024-05-23 2324/week @ 2024-05-30 1848/week @ 2024-06-06 1829/week @ 2024-06-13 1966/week @ 2024-06-20 2164/week @ 2024-06-27

8,205 每月下载量
用于 17 个crate (7 直接)

MIT 协议

49KB
1K SLoC

Rust通用netlink数据包类型的crate


lib.rs:

该crate提供了通用netlink族及其控制器的数据包。

[GenlMessage] 提供了一个通用netlink族消息,它独立于子协议。您可以将您的消息包装到该类型中,然后它可以在 netlink-proto crate中使用。

实现通用netlink族

通用netlink族包含几个命令和头部中的一个版本号。

有效载荷通常由netlink属性组成,携带消息到对端。为了帮助您将有效载荷构建成有效的netlink数据包,此crate需要有关族ID和通用头部信息。因此,您需要在您的类型上实现一些特型。

有效载荷中的所有内容,包括所有使用的netlink属性和可选的头部,应由您的实现处理。

序列化/反序列化

为了实现您的通用netlink族,您应该处理有效载荷序列化过程,包括其特定的头部(如果有)和netlink属性。

要实现这一点,您应该为有效载荷类型实现 netlink_packet_utils::Emitable 特型。

对于反序列化,应实现netlink_packet_utils::ParseableParametrized<[u8], GenlHeader>特质。如上所述,为了提供更好的可扩展性,我们在这里使用最简单的缓冲区类型:[u8]。在反序列化过程中,您可以轻松将其转换为其他缓冲区类型。

GenlFamily特质

该特质旨在提供一些必要的信息,以便构建netlink(nlmsghdr)和通用netlink(genlmsghdr)的数据包头。

family_name()

该方法使解析器能够获取内核中注册的名称。

family_id()

少数netlink家族具有静态家族ID(例如控制器)。该方法主要用于让这些家族返回它们的家族ID。

如果您不知道这是什么,请不要实现此方法。因为默认实现返回GENL_ID_GENERATE,这意味着家族ID由内核动态分配。

command()

此方法告知通用netlink数据包的命令ID。返回值用于填充通用netlink头中的cmd字段。

version()

此方法返回有效载荷的家族版本。返回值用于填充通用netlink头中的version字段。

家族头

少数家族会使用特定的家族消息头。为了简化和可扩展性,此crate将其视为有效载荷的一部分,并让实现自行处理头。

如果您正在实现此类通用家族,请注意,您应该在您的有效载荷类型中定义头数据结构并处理序列化。

依赖项

~0.6–1.1MB
~24K SLoC