rl2tp/message/avp/types/
protocol_version.rs1use crate::avp::{QueryableAVP, WritableAVP};
2use crate::common::{DecodeError, DecodeResult, Reader, Writer};
3
4#[derive(Clone, Copy, Debug, Eq, PartialEq)]
5pub struct ProtocolVersion {
6 pub version: u8,
7 pub revision: u8,
8}
9
10impl ProtocolVersion {
11 const ATTRIBUTE_TYPE: u16 = 2;
12 const LENGTH: usize = 2;
13
14 #[inline]
15 pub fn try_read<T>(reader: &mut impl Reader<T>) -> DecodeResult<Self> {
16 if reader.len() < Self::LENGTH {
17 return Err(DecodeError::IncompleteAVP(Self::ATTRIBUTE_TYPE));
18 }
19
20 let version = unsafe { reader.read_u8_unchecked() };
21 let revision = unsafe { reader.read_u8_unchecked() };
22 Ok(Self { version, revision })
23 }
24}
25
26impl QueryableAVP for ProtocolVersion {
27 #[inline]
28 fn get_length(&self) -> usize {
29 Self::LENGTH
30 }
31}
32
33impl WritableAVP for ProtocolVersion {
34 #[inline]
35 fn write(&self, writer: &mut impl Writer) {
36 writer.write_u16_be(Self::ATTRIBUTE_TYPE);
37 writer.write_bytes(&[self.version, self.revision]);
38 }
39}