1 个不稳定版本
0.1.0 | 2023 年 3 月 6 日 |
---|
10 在 #dhcp-server 中排名
14,280 每月下载量
在 6 个crate中(通过 dhcproto)使用
7KB
175 行
dhcproto
DHCPv4/DHCPv6 解析器和编码器。 dhcproto
旨在实现一个功能完整的 DHCP 实现。已实现了许多常见的选项类型,欢迎提交 PR 来完善缺失的类型。
注意! 我们正在使用这个库开发一个名为 dora 的 DHCP 服务器!
功能
- v4 是 100% 安全的 Rust (v6 在检查边界后使用
get_unchecked
) - v4 和 v6 消息类型
- v4 和 v6 消息头获取/设置器,所有数据可变
- 具有 100 多个完全类型安全变体的选项类型(接受未知变体的 PR)
- 支持长选项编码(RFC 3396)(允许编码超过 255 字节的选项)
- 基准测试编码/解码
crates.io
https://crates.io/crates/dhcproto
最低 Rust 版本
此 crate 使用 const generics,需要 Rust 1.53
示例
(v4) 解码/编码
use dhcproto::v4::{Message, Encoder, Decoder, Decodable, Encodable};
// decode
let bytes = dhcp_offer();
let msg = Message::decode(&mut Decoder::new(&bytes))?;
// now encode
let mut buf = Vec::new();
let mut e = Encoder::new(&mut buf);
msg.encode(&mut e)?;
(v4) 构建消息
use dhcproto::{v4, Encodable, Encoder};
// hardware addr
let chaddr = vec![
29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
];
// construct a new Message
let mut msg = v4::Message::default();
msg.set_flags(v4::Flags::default().set_broadcast()) // set broadcast to true
.set_chaddr(&chaddr) // set chaddr
.opts_mut()
.insert(v4::DhcpOption::MessageType(v4::MessageType::Discover)); // set msg type
// set some more options
msg.opts_mut()
.insert(v4::DhcpOption::ParameterRequestList(vec![
v4::OptionCode::SubnetMask,
v4::OptionCode::Router,
v4::OptionCode::DomainNameServer,
v4::OptionCode::DomainName,
]));
msg.opts_mut()
.insert(v4::DhcpOption::ClientIdentifier(chaddr));
// now encode to bytes
let mut buf = Vec::new();
let mut e = Encoder::new(&mut buf);
msg.encode(&mut e)?;
// buf now has the contents of the encoded DHCP message
支持的 RFC
DHCPv6
- https://datatracker.ietf.org/doc/html/rfc8415
- https://datatracker.ietf.org/doc/html/rfc3646
- https://datatracker.ietf.org/doc/html/rfc3633
- https://datatracker.ietf.org/doc/html/rfc5007 (仅消息类型)
- https://datatracker.ietf.org/doc/html/rfc5908
- https://datatracker.ietf.org/doc/html/rfc5460 (仅消息类型/状态码,无 opt 53)
- https://datatracker.ietf.org/doc/html/rfc6977 (仅消息类型)
- https://datatracker.ietf.org/doc/html/rfc7341 (仅消息类型)
DHCPv4
- https://tools.ietf.org/html/rfc2131
- https://tools.ietf.org/html/rfc3011
- https://tools.ietf.org/html/rfc3232
- https://tools.ietf.org/html/rfc3203
- https://tools.ietf.org/html/rfc3046
- https://tools.ietf.org/html/rfc3396
- https://tools.ietf.org/html/rfc3397
- https://tools.ietf.org/html/rfc4039
- https://tools.ietf.org/html/rfc4280
- https://tools.ietf.org/html/rfc4388(消息类型 & 选项)
- https://tools.ietf.org/html/rfc4578
- https://tools.ietf.org/html/rfc4702
- https://tools.ietf.org/html/rfc6926(消息类型 & 选项 151-157)
- https://tools.ietf.org/html/rfc7724(仅消息类型,选项 151 的状态代码尚未实现)
- https://tools.ietf.org/html/rfc8910
- https://tools.ietf.org/html/rfc2563
- https://tools.ietf.org/html/rfc8925