#dhcp #dhcpv4 #dhcpv6 #generate #dhcp-server

dhcproto-macros

dhcproto 生成选项类型的宏库

1 个不稳定版本

0.1.0 2023 年 3 月 6 日

10#dhcp-server 中排名

Download history 4566/week @ 2024-03-24 3060/week @ 2024-03-31 3349/week @ 2024-04-07 3127/week @ 2024-04-14 2345/week @ 2024-04-21 2895/week @ 2024-04-28 3048/week @ 2024-05-05 3696/week @ 2024-05-12 2678/week @ 2024-05-19 2832/week @ 2024-05-26 2609/week @ 2024-06-02 2821/week @ 2024-06-09 2581/week @ 2024-06-16 3764/week @ 2024-06-23 3125/week @ 2024-06-30 4666/week @ 2024-07-07

14,280 每月下载量
6 个crate中(通过 dhcproto)使用

MIT 许可证

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

DHCPv4

无运行时依赖