#![allow(unused)]
use bytes::{BufMut, BytesMut};
use nom::{
number::complete::{be_u16, be_u32, be_u8},
IResult,
};
const INITIATOR_OPTIONS_SERIALIZED_LEN: usize = 16usize;
const RESPONDER_OPTIONS_SERIALIZED_LEN: usize = 16usize;
#[derive(Debug)]
pub struct InitiatorOptions {
pub network_id: u8,
pub version: u8,
pub padding_length: u16,
pub m3_p2_len: u16,
pub timestamp: u32,
}
impl InitiatorOptions {
pub fn parse_frame(input: &[u8]) -> IResult<&[u8], Self> {
let (rest, network_id) = be_u8(input)?;
let (rest, version) = be_u8(rest)?;
let (rest, padding_length) = be_u16(rest)?;
let (rest, m3_p2_len) = be_u16(rest)?;
let (rest, _) = be_u16(rest)?; let (rest, timestamp) = be_u32(rest)?;
let (rest, _) = be_u32(rest)?;
Ok((
rest,
Self {
network_id,
version,
padding_length,
m3_p2_len,
timestamp,
},
))
}
pub fn parse(input: &[u8]) -> Option<Self> {
Self::parse_frame(input).ok().map(|(_, message)| message)
}
pub fn serialize(self) -> BytesMut {
let mut out = BytesMut::with_capacity(INITIATOR_OPTIONS_SERIALIZED_LEN);
out.put_u8(self.network_id);
out.put_u8(self.version);
out.put_u16(self.padding_length);
out.put_u16(self.m3_p2_len);
out.put_u16(0u16); out.put_u32(self.timestamp);
out.put_u32(0u32);
out
}
}
#[derive(Debug)]
pub struct ResponderOptions {
pub padding_length: u16,
pub timestamp: u32,
}
impl ResponderOptions {
pub fn parse_frame(input: &[u8]) -> IResult<&[u8], Self> {
let (rest, _) = be_u16(input)?; let (rest, padding_length) = be_u16(rest)?;
let (rest, _) = be_u32(rest)?; let (rest, timestamp) = be_u32(rest)?;
let (rest, _) = be_u32(rest)?;
Ok((
rest,
Self {
padding_length,
timestamp,
},
))
}
pub fn parse(input: &[u8]) -> Option<Self> {
Self::parse_frame(input).ok().map(|(_, message)| message)
}
pub fn serialize(self) -> BytesMut {
let mut out = BytesMut::with_capacity(RESPONDER_OPTIONS_SERIALIZED_LEN);
out.put_u16(0u16); out.put_u16(self.padding_length);
out.put_u32(0u32); out.put_u32(self.timestamp);
out.put_u32(0u32);
out
}
}