File: udp.rs

package info (click to toggle)
rust-pktparse 0.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 132 kB
  • sloc: makefile: 2
file content (42 lines) | stat: -rw-r--r-- 1,133 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//! Handles parsing of UDP header

use nom::be_u16;

#[derive(Debug, PartialEq, Eq)]
#[cfg_attr(feature = "derive", derive(Serialize, Deserialize))]
pub struct UdpHeader {
    pub source_port: u16,
    pub dest_port: u16,
    pub length: u16,
    pub checksum: u16,
}

named!(pub parse_udp_header<&[u8], UdpHeader>, do_parse!(
        source_port: be_u16 >>
        dest_port: be_u16 >>
        length: be_u16 >>
        checksum: be_u16 >>
    (
        UdpHeader{source_port: source_port, dest_port: dest_port, length: length, checksum: checksum}
    )
));

#[cfg(test)]
mod tests {
    use super::{UdpHeader, parse_udp_header};
    const EMPTY_SLICE: &'static [u8] = &[];

    #[test]
    fn udp_header_works() {
        let bytes = [0x00, 0x12, 0x11, 0x11, // source & destination ports
                     0x00, 0x1b, 0x21, 0x0f, // length & checksum
                    ];
        let expectation = UdpHeader {
            source_port: 0x12,
            dest_port: 0x1111,
            length: 0x1b,
            checksum: 0x210f,
        };
        assert_eq!(parse_udp_header(&bytes), Ok((EMPTY_SLICE, expectation)));
    }
}