webrtc_dtls/handshake/
handshake_header.rs1use std::io::{Read, Write};
2
3use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
4
5use super::*;
6
7pub(crate) const HANDSHAKE_HEADER_LENGTH: usize = 12;
10
11#[derive(Copy, Clone, PartialEq, Eq, Debug, Default)]
12pub struct HandshakeHeader {
13 pub(crate) handshake_type: HandshakeType,
14 pub(crate) length: u32, pub(crate) message_sequence: u16,
16 pub(crate) fragment_offset: u32, pub(crate) fragment_length: u32, }
19
20impl HandshakeHeader {
21 pub fn size(&self) -> usize {
22 1 + 3 + 2 + 3 + 3
23 }
24
25 pub fn marshal<W: Write>(&self, writer: &mut W) -> Result<()> {
26 writer.write_u8(self.handshake_type as u8)?;
27 writer.write_u24::<BigEndian>(self.length)?;
28 writer.write_u16::<BigEndian>(self.message_sequence)?;
29 writer.write_u24::<BigEndian>(self.fragment_offset)?;
30 writer.write_u24::<BigEndian>(self.fragment_length)?;
31
32 Ok(writer.flush()?)
33 }
34
35 pub fn unmarshal<R: Read>(reader: &mut R) -> Result<Self> {
36 let handshake_type = reader.read_u8()?.into();
37 let length = reader.read_u24::<BigEndian>()?;
38 let message_sequence = reader.read_u16::<BigEndian>()?;
39 let fragment_offset = reader.read_u24::<BigEndian>()?;
40 let fragment_length = reader.read_u24::<BigEndian>()?;
41
42 Ok(HandshakeHeader {
43 handshake_type,
44 length,
45 message_sequence,
46 fragment_offset,
47 fragment_length,
48 })
49 }
50}