pub struct BvllFrame<'a> {
pub function: BvlcFunction,
pub payload: &'a [u8],
}Expand description
A BVLL message whose header checks out, before its payload is read.
BvllFrame::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, or decide how to answer a request whose payload is malformed,
before BvllFrame::message reads the payload by the function’s
layout.
Fields§
§function: BvlcFunctionThe function octet.
payload: &'a [u8]The octets after the 4-octet header.
Implementations§
Source§impl<'a> BvllFrame<'a>
impl<'a> BvllFrame<'a>
Sourcepub fn decode(datagram: &'a [u8]) -> Result<Self, BvllError>
pub fn decode(datagram: &'a [u8]) -> Result<Self, BvllError>
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 0x81, and a Length field equal to the datagram’s length, since it counts the whole message (Annex J.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::{BvlcFunction, BvllError, BvllFrame};
// A Read-Foreign-Device-Table: header only.
let frame = BvllFrame::decode(&[0x81, 0x06, 0x00, 0x04])?;
assert_eq!(frame.function, BvlcFunction::READ_FOREIGN_DEVICE_TABLE);
assert!(frame.payload.is_empty());
// An unknown function still has a frame, but no message.
let frame = BvllFrame::decode(&[0x81, 0x0C, 0x00, 0x05, 0xAA])?;
assert_eq!(frame.message(), Err(BvllError::UnknownFunction { function: 0x0C }));
// A trailing octet the Length field doesn't count.
assert_eq!(
BvllFrame::decode(&[0x81, 0x06, 0x00, 0x04, 0x00]),
Err(BvllError::LengthMismatch { declared: 4, received: 5 }),
);Sourcepub fn message(self) -> Result<Bvll<'a>, BvllError>
pub fn message(self) -> Result<Bvll<'a>, BvllError>
Read the payload by the function’s layout (see
BvlcFunction::payload_shape).
Fails with BvllError::UnknownFunction for a function Annex J
doesn’t define, and with BvllError::PayloadLength when the payload
is the wrong length for its function. Field values are not judged: an
undefined result code, a zero time-to-live, any mask or address, and
an empty NPDU all decode.