use crate::{Buf, BufError, BufMut, BufResult, Codec, Cursor, igmp::Checksum, ipv4::Address};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Query {
pub max_response_time: u8,
pub checksum: Checksum,
pub group_address: Address,
}
impl Query {
pub const TYPE: u8 = 0x11;
}
impl Codec for Query {
fn encode<W: BufMut>(&self, writer: &mut Cursor<W>, _: ()) -> BufResult<()> {
Self::TYPE.encode(writer, ())?;
self.max_response_time.encode(writer, ())?;
self.checksum.encode(writer, ())?;
let addr_bytes: [u8; 4] = self.group_address.into();
addr_bytes.encode(writer, ())
}
fn decode<R: Buf>(reader: &mut Cursor<R>, _: ()) -> BufResult<Self> {
if u8::decode(reader, ())? != Self::TYPE {
return Err(BufError::UnexpectedValue);
}
Ok(Self {
max_response_time: u8::decode(reader, ())?,
checksum: Checksum::decode(reader, ())?,
group_address: Address::from(reader.read_array::<4>()?),
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Report {
pub reserved: u8,
pub checksum: Checksum,
pub group_address: Address,
}
impl Report {
pub const TYPE: u8 = 0x16;
}
impl Codec for Report {
fn encode<W: BufMut>(&self, writer: &mut Cursor<W>, _: ()) -> BufResult<()> {
Self::TYPE.encode(writer, ())?;
self.reserved.encode(writer, ())?;
self.checksum.encode(writer, ())?;
let addr_bytes: [u8; 4] = self.group_address.into();
addr_bytes.encode(writer, ())
}
fn decode<R: Buf>(reader: &mut Cursor<R>, _: ()) -> BufResult<Self> {
if u8::decode(reader, ())? != Self::TYPE {
return Err(BufError::UnexpectedValue);
}
Ok(Self {
reserved: u8::decode(reader, ())?,
checksum: Checksum::decode(reader, ())?,
group_address: Address::from(reader.read_array::<4>()?),
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct LeaveGroup {
pub reserved: u8,
pub checksum: Checksum,
pub group_address: Address,
}
impl LeaveGroup {
pub const TYPE: u8 = 0x17;
}
impl Codec for LeaveGroup {
fn encode<W: BufMut>(&self, writer: &mut Cursor<W>, _: ()) -> BufResult<()> {
Self::TYPE.encode(writer, ())?;
self.reserved.encode(writer, ())?;
self.checksum.encode(writer, ())?;
let addr_bytes: [u8; 4] = self.group_address.into();
addr_bytes.encode(writer, ())
}
fn decode<R: Buf>(reader: &mut Cursor<R>, _: ()) -> BufResult<Self> {
if u8::decode(reader, ())? != Self::TYPE {
return Err(BufError::UnexpectedValue);
}
Ok(Self {
reserved: u8::decode(reader, ())?,
checksum: Checksum::decode(reader, ())?,
group_address: Address::from(reader.read_array::<4>()?),
})
}
}