capsules_extra/net/udp/
udp.rs1use crate::net::stream::decode_u16;
11use crate::net::stream::encode_u16;
12use crate::net::stream::SResult;
13
14#[derive(Copy, Clone, Debug)]
21pub struct UDPHeader {
22 src_port: u16,
23 dst_port: u16,
24 len: u16,
25 cksum: u16,
26}
27
28impl Default for UDPHeader {
29 fn default() -> UDPHeader {
30 UDPHeader {
31 src_port: 0,
32 dst_port: 0,
33 len: 8,
34 cksum: 0,
35 }
36 }
37}
38
39impl UDPHeader {
40 pub fn new() -> UDPHeader {
41 UDPHeader::default()
42 }
43 pub fn get_offset(&self) -> usize {
45 8
46 }
47
48 pub fn set_dst_port(&mut self, port: u16) {
49 self.dst_port = port.to_be();
50 }
51 pub fn set_src_port(&mut self, port: u16) {
52 self.src_port = port.to_be();
53 }
54
55 pub fn set_len(&mut self, len: u16) {
56 self.len = len.to_be();
57 }
58
59 pub fn set_cksum(&mut self, cksum: u16) {
60 self.cksum = cksum.to_be();
61 }
62
63 pub fn get_src_port(&self) -> u16 {
64 u16::from_be(self.src_port)
65 }
66
67 pub fn get_dst_port(&self) -> u16 {
68 u16::from_be(self.dst_port)
69 }
70
71 pub fn get_len(&self) -> u16 {
72 u16::from_be(self.len)
73 }
74
75 pub fn get_cksum(&self) -> u16 {
76 u16::from_be(self.cksum)
77 }
78
79 pub fn get_hdr_size(&self) -> usize {
80 8
82 }
83
84 pub fn encode(&self, buf: &mut [u8], offset: usize) -> SResult<usize> {
96 stream_len_cond!(buf, self.get_hdr_size() + offset);
97
98 let mut off = offset;
99 off = enc_consume!(buf, off; encode_u16, self.src_port);
100 off = enc_consume!(buf, off; encode_u16, self.dst_port);
101 off = enc_consume!(buf, off; encode_u16, self.len);
102 off = enc_consume!(buf, off; encode_u16, self.cksum);
103 stream_done!(off, off);
104 }
105
106 pub fn decode(buf: &[u8]) -> SResult<UDPHeader> {
116 stream_len_cond!(buf, 8);
117 let mut udp_header = Self::new();
118 let off = 0;
119 let (off, src_port) = dec_try!(buf, off; decode_u16);
120 udp_header.src_port = u16::from_be(src_port);
121 let (off, dst_port) = dec_try!(buf, off; decode_u16);
122 udp_header.dst_port = u16::from_be(dst_port);
123 let (off, len) = dec_try!(buf, off; decode_u16);
124 udp_header.len = u16::from_be(len);
125 let (off, cksum) = dec_try!(buf, off; decode_u16);
126 udp_header.cksum = u16::from_be(cksum);
127 stream_done!(off, udp_header);
128 }
129}