#stack #real-time #data #ethernet #udp #acquisition #heapless

nightly no-std catnip

无标准库、不panic、无堆栈的UDP/IP以太网堆栈,用于数据采集和实时控制

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次下载

MIT/Apache

51KB
923

catnip

一个无标准库、不panic、无堆栈、功能最少的UDP/IP堆栈,用于裸机。适用于局域网上的实时数据采集和控制。

利用const generic表达式提供灵活性,并保证长度为头和数据段的正确性,而不使用动态分配。

因此,该crate目前依赖于nightly通道,并且因此可能会定期出现问题,直到所需的功能稳定。

该库正在积极开发中;主要功能尚未实现,我相信一些错误尚未被发现。

文档:https://docs.rs/catnip

示例

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伪套接字特性,具有任意同步/异步发送和接收函数
  • 一旦特性和泛型参数化中定义的常量可用,就转移到稳定版本

许可证

在以下任一许可证下获得许可

任选其一。

依赖项

~0.5–1MB
~20K SLoC