#rip #parser-serializer #protocols #packet #v1-v2

rip-rs

Parser and serializer library for RIP v1/v2 protocol

1 unstable release

0.0.1 Nov 14, 2023

#5 in #rip

MIT license

69KB
2K SLoC

rip-rs Check codecov

RIP v1/v2 protocol parser and serializer for Rust.

Synopsis

Parse a packet

use rip::parser;

fn main() {
    let result = parser::parse(
        vec![
            2, 2, 0, 0,
            0, 2, 1, 2,
            192, 0, 2, 100,
            255, 255, 255, 0,
            192, 0, 2, 111,
            4, 3, 2, 1,
        ]
            .as_slice(),
    );

    let packet = match result.unwrap() {
        parser::ParsedPacket::V1(_) => {
            panic!("the packet version must not be 1 because the second byte is 2");
        }
        parser::ParsedPacket::V2(p) => p,
    };

    println!("{:?}", packet);
    // =>
    //   Packet {
    //     header: Header {
    //       command: Response,
    //       version: Version2
    //     },
    //     entries: [
    //       Entry {
    //         address_family_identifier: IP,
    //         route_tag: 258,
    //         ip_address: 192.0.2.100,
    //         subnet_mask: 255.255.255.0,
    //         next_hop: 192.0.2.111,
    //         metric: 67305985
    //       }
    //     ]
    //   }
}

Serialize a packet

use rip::header::Header;
use rip::packet::Packet;
use rip::serializer::serialize_v2_packet;
use rip::{address_family, command, v2, version};
use std::net::Ipv4Addr;

fn main() {
    let packet = Packet::make_v2_packet(
        Header::new(command::Kind::Response, version::Version::Version2),
        vec![v2::Entry::new(
            address_family::Identifier::IP,
            258,
            Ipv4Addr::new(192, 0, 2, 100),
            Ipv4Addr::new(255, 255, 255, 0),
            Ipv4Addr::new(192, 0, 2, 111),
            67305985,
        )],
    ).unwrap();

    let serialized = serialize_v2_packet(packet).unwrap();
    println!("{:?}", serialized);
    // =>
    //   [
    //     2, 2, 0, 0,
    //     0, 2, 1, 2,
    //     192, 0, 2, 100,
    //     255, 255, 255, 0,
    //     192, 0, 2, 111,
    //     4, 3, 2, 1
    //   ]
}

see also examples.

TODO

  • RIPv2 cryptographic authentication support
  • RIPng support

References

Author

moznion (moznion@mail.moznion.net)

Dependencies

~260–710KB
~17K SLoC