7个版本
0.3.1 | 2023年5月23日 |
---|---|
0.3.0 | 2022年8月31日 |
0.2.0 | 2022年7月23日 |
0.1.4 | 2022年5月13日 |
0.1.3 | 2022年4月16日 |
#1630 in 网络编程
每月48次下载
51KB
923 行
catnip
一个无标准库、不panic、无堆栈、功能最少的UDP/IP堆栈,用于裸机。适用于局域网上的实时数据采集和控制。
利用const generic表达式提供灵活性,并保证长度为头和数据段的正确性,而不使用动态分配。
因此,该crate目前依赖于nightly通道,并且因此可能会定期出现问题,直到所需的功能稳定。
该库正在积极开发中;主要功能尚未实现,我相信一些错误尚未被发现。
示例
use catnip::*;
// Some made-up data with two 32-bit words' worth of bytes and some arbitrary addresses
let data: ByteArray<8> = ByteArray([0, 1, 2, 3, 4, 5, 6, 7]);
// Build frame
let frame = EthernetFrame::<IpV4Frame<UdpFrame<ByteArray<8>>>> {
header: EthernetHeader {
dst_macaddr: MacAddr::BROADCAST,
src_macaddr: MacAddr::new([0x02, 0xAF, 0xFF, 0x1A, 0xE5, 0x3C]),
ethertype: EtherType::IpV4,
},
data: IpV4Frame::<UdpFrame<ByteArray<8>>> {
header: IpV4Header {
version_and_header_length: VersionAndHeaderLength::new().with_version(4).with_header_length((IpV4Header::BYTE_LEN / 4) as u8),
dscp: DSCP::Standard,
total_length: IpV4Frame::<UdpFrame<ByteArray<8>>>::BYTE_LEN as u16,
identification: 0,
fragmentation: Fragmentation::default(),
time_to_live: 10,
protocol: Protocol::Udp,
checksum: 0,
src_ipaddr: IpV4Addr::new([10, 0, 0, 120]),
dst_ipaddr: IpV4Addr::new([10, 0, 0, 121]),
},
data: UdpFrame::<ByteArray<8>> {
header: UdpHeader {
src_port: 8123,
dst_port: 8125,
length: UdpFrame::<ByteArray<8>>::BYTE_LEN as u16,
checksum: 0,
},
data: data,
},
},
checksum: 0_u32,
};
// Calculate IP and UDP checksums
frame.data.data.header.checksum = calc_udp_checksum(&frame.data);
frame.data.header.checksum = calc_ip_checksum(&frame.data.header.to_be_bytes());
// Reduce to big-endian network bytes
let bytes = frame.to_be_bytes();
// Parse from bytes
let frame_parsed = EthernetFrame::<IpV4Frame<UdpFrame<ByteArray<8>>>>::read_bytes(&bytes);
assert_eq!(frame_parsed, frame);
特性
- 以太网II帧
- IPV4
- UDP
- ARP
- DHCP (仅INFORM)
待办事项
- 添加UDP伪套接字特性,具有任意同步/异步发送和接收函数
- 一旦特性和泛型参数化中定义的常量可用,就转移到稳定版本
许可证
在以下任一许可证下获得许可
- Apache许可证第2版,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
依赖项
~0.5–1MB
~20K SLoC