pub struct Bvll6Frame<'a> {
pub function: Bvlc6Function,
pub payload: &'a [u8],
}Expand description
A B/IPv6 BVLL message whose header checks out, before its payload is read.
Bvll6Frame::decode checks the BVLC type and the Length field and
accepts any function code, so a receiver can see a function it doesn’t
know before Bvll6Frame::message reads the payload by the function’s
layout.
Fields§
§function: Bvlc6FunctionThe function octet.
payload: &'a [u8]The octets after the 4-octet header, from the first VMAC on.
Implementations§
Source§impl<'a> Bvll6Frame<'a>
impl<'a> Bvll6Frame<'a>
Sourcepub fn decode(datagram: &'a [u8]) -> Result<Self, Bvll6Error>
pub fn decode(datagram: &'a [u8]) -> Result<Self, Bvll6Error>
Check a datagram’s BVLL header and split off its payload.
The datagram must be one whole message: at least the 4-octet header, BVLC type 0x82, and a Length field equal to the datagram’s length, since it counts the whole message (Annex U.2). Octets after the declared length are refused rather than ignored, so a datagram can’t pass for a shorter message.
use bacnet_bip_codec::ipv6::{Bvlc6Function, Bvll6Error, Bvll6Frame};
// A Virtual-Address-Resolution from VMAC 00 04 D2.
let frame = Bvll6Frame::decode(&[0x82, 0x06, 0x00, 0x07, 0x00, 0x04, 0xD2])?;
assert_eq!(frame.function, Bvlc6Function::VIRTUAL_ADDRESS_RESOLUTION);
assert_eq!(frame.payload, [0x00, 0x04, 0xD2]);
// Function 0x0B still has a frame, but no message.
let frame = Bvll6Frame::decode(&[0x82, 0x0B, 0x00, 0x07, 0x00, 0x04, 0xD2])?;
assert_eq!(frame.message(), Err(Bvll6Error::UnknownFunction { function: 0x0B }));
// A trailing octet the Length field doesn't count.
assert_eq!(
Bvll6Frame::decode(&[0x82, 0x06, 0x00, 0x07, 0x00, 0x04, 0xD2, 0x00]),
Err(Bvll6Error::LengthMismatch { declared: 7, received: 8 }),
);Sourcepub fn message(self) -> Result<Bvll6<'a>, Bvll6Error>
pub fn message(self) -> Result<Bvll6<'a>, Bvll6Error>
Read the payload by the function’s layout (see
Bvlc6Function::payload_shape).
Fails with Bvll6Error::UnknownFunction for a function Annex U
doesn’t define, and with Bvll6Error::PayloadLength when the
payload is the wrong length for its function. Field values are not
judged: any VMAC or address, an undefined result code, a zero
time-to-live and an empty NPDU all decode.