Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 25 additions & 14 deletions src/base_packet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,34 +44,40 @@

bitfield! {
/// The MCTP Transport Header, 4 bytes long.
pub struct MCTPTransportHeader(MSB0 [u8]);
pub struct MCTPTransportHeader(u32);
u8;
rsvd, _ : 3, 0;
rsvd, _ : 31, 28;
/// Header version
pub hdr_version, set_hdr_version: 7, 4;
#[inline]
pub hdr_version, set_hdr_version: 27, 24;
/// Destination Endpoint ID
pub dest_endpoint_id, set_dest_endpoint_id: 15, 8;
#[inline]
pub dest_endpoint_id, set_dest_endpoint_id: 23, 16;
/// Source Endpoint ID
pub source_endpoint_id, set_source_endpoint_id: 23, 16;
#[inline]
pub source_endpoint_id, set_source_endpoint_id: 15, 8;
/// Start of Message
pub som, set_som: 24, 24;
#[inline]
pub som, set_som: 7, 7;
/// End of Message
pub eom, set_eom: 25, 25;
#[inline]
pub eom, set_eom: 6, 6;
/// Packet Sequence Number
pub pkt_seq, set_pkt_seq: 27, 26;
#[inline]
pub pkt_seq, set_pkt_seq: 5, 4;
/// Tag Owner
pub to, set_to: 28, 28;
#[inline]
pub to, set_to: 3, 3;
/// Message Tag
pub msg_tag, set_msg_tag: 31, 29;
pub msg_tag, set_msg_tag: 2, 0;
}

impl MCTPTransportHeader<[u8; 4]> {
impl MCTPTransportHeader {
/// Create a new MCTPTransportHeader.
///
/// `version`: The transport layer specific header version.
pub fn new(version: u8) -> Self {
let buf = [0; 4];
let mut tran_header = MCTPTransportHeader(buf);
let mut tran_header = MCTPTransportHeader(0);

tran_header.set_hdr_version(version);

Expand All @@ -83,7 +89,7 @@
/// `buffer`: The existing buffer for the `MCTPTransportHeader`
/// `version`: The transport layer specific header version.
pub fn new_from_buf(buf: [u8; 4], version: u8) -> Result<Self, ()> {
let header = MCTPTransportHeader(buf);
let header = MCTPTransportHeader(u32::from_be_bytes(buf));

if header.rsvd() != 0x00 {
return Err(());
Expand All @@ -95,6 +101,11 @@

Ok(header)
}

/// Return the header as bytes.
pub fn to_bytes(&self) -> [u8; 4] {
self.0.to_be_bytes()
}
}

bitfield! {
Expand Down Expand Up @@ -174,7 +185,7 @@
}
}

impl<'a, 'b> MCTPHeader for MCTPMessageBody<'a, 'b> {

Check warning on line 188 in src/base_packet.rs

View workflow job for this annotation

GitHub Actions / ci-check

the following explicit lifetimes could be elided: 'a, 'b
/// Return the number of bytes used by the packet.
fn len(&self) -> usize {
let mut offset = 0;
Expand Down
4 changes: 2 additions & 2 deletions src/mctp_traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
fn len(&self) -> usize;

/// Check if the header is empty
fn is_empty(&self) -> bool {

Check warning on line 17 in src/mctp_traits.rs

View workflow job for this annotation

GitHub Actions / ci-check

method `is_empty` is never used

Check warning on line 17 in src/mctp_traits.rs

View workflow job for this annotation

GitHub Actions / ci-check

method `is_empty` is never used

Check warning on line 17 in src/mctp_traits.rs

View workflow job for this annotation

GitHub Actions / ci-check

method `is_empty` is never used
self.len() == 0
}

Expand Down Expand Up @@ -107,8 +107,8 @@
fn set_eid(&self, eid: u8);

/// Generate a transport header
fn generate_transport_header(&self, dest_addr: u8) -> MCTPTransportHeader<[u8; 4]> {
let mut base_header: MCTPTransportHeader<[u8; 4]> = MCTPTransportHeader::new(HDR_VERSION);
fn generate_transport_header(&self, dest_addr: u8) -> MCTPTransportHeader {
let mut base_header: MCTPTransportHeader = MCTPTransportHeader::new(HDR_VERSION);
base_header.set_dest_endpoint_id(dest_addr);
base_header.set_source_endpoint_id(self.get_address());
base_header.set_som(true as u8);
Expand Down
6 changes: 3 additions & 3 deletions src/smbus.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ use smbus_pec::pec;
/// The returned data for SMBus headers
type SMBusHeaders = (
MCTPSMBusHeader<[u8; 4]>,
MCTPTransportHeader<[u8; 4]>,
MCTPTransportHeader,
MCTPMessageBodyHeader<[u8; 1]>,
);

Expand Down Expand Up @@ -355,7 +355,7 @@ impl<'m> MCTPSMBusContext<'m> {
fn get_mctp_control_packet<'a, 'b>(
&self,
_smbus_header: &MCTPSMBusHeader<[u8; 4]>,
_base_header: &MCTPTransportHeader<[u8; 4]>,
_base_header: &MCTPTransportHeader,
body_header: &'b MCTPMessageBodyHeader<[u8; 1]>,
packet: &'a [u8],
calculated_pec: u8,
Expand Down Expand Up @@ -426,7 +426,7 @@ impl<'m> MCTPSMBusContext<'m> {
fn decode_mctp_control<'a>(
&self,
smbus_header: &MCTPSMBusHeader<[u8; 4]>,
base_header: &MCTPTransportHeader<[u8; 4]>,
base_header: &MCTPTransportHeader,
body_header: &MCTPMessageBodyHeader<[u8; 1]>,
packet: &'a [u8],
calculated_pec: u8,
Expand Down
6 changes: 3 additions & 3 deletions src/smbus_proto.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,15 @@
/// The final constructed SMBus packet.
pub(crate) struct MCTPSMBusPacket<'a, 'b> {
smbus_header: &'a mut MCTPSMBusHeader<[u8; 4]>,
base_header: &'a MCTPTransportHeader<[u8; 4]>,
base_header: &'a MCTPTransportHeader,
data_bytes: &'a MCTPMessageBody<'a, 'b>,
}

impl<'a, 'b> MCTPSMBusPacket<'a, 'b> {
/// Create a new SMBUs packet
pub fn new(
smbus_header: &'a mut MCTPSMBusHeader<[u8; 4]>,
base_header: &'a MCTPTransportHeader<[u8; 4]>,
base_header: &'a MCTPTransportHeader,
data_bytes: &'b MCTPMessageBody,
) -> Self {
let mut packet = Self {
Expand All @@ -86,7 +86,7 @@
}
}

impl<'a, 'b> MCTPHeader for MCTPSMBusPacket<'a, 'b> {

Check warning on line 89 in src/smbus_proto.rs

View workflow job for this annotation

GitHub Actions / ci-check

the following explicit lifetimes could be elided: 'a, 'b
/// Return the number of bytes used by the packet.
fn len(&self) -> usize {
let mut size = 0;
Expand All @@ -111,7 +111,7 @@
buf[0..4].copy_from_slice(&self.smbus_header.0);
size += 4;

buf[4..8].copy_from_slice(&self.base_header.0);
buf[4..8].copy_from_slice(&self.base_header.to_bytes());
size += 4;

size += self.data_bytes.to_raw_bytes(&mut buf[size..]);
Expand Down
2 changes: 1 addition & 1 deletion src/smbus_request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -555,7 +555,7 @@ mod tests {
let ctx = MCTPSMBusContextRequest::new(SOURCE_ID);

let header = ctx.generate_transport_header(DEST_ID);
let buf = header.0;
let buf = header.to_bytes();

// HDR version and reserved field
assert_eq!(buf[0], HDR_VERSION);
Expand Down
2 changes: 1 addition & 1 deletion src/smbus_response.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@
let message_data: [u8; 4] = [
completion_code as u8,
self.eid.get(),
(endpoint_type as u8) << 4 | endpoint_id_type as u8,

Check warning on line 124 in src/smbus_response.rs

View workflow job for this annotation

GitHub Actions / ci-check

operator precedence can trip the unwary
fairness_support as u8,
];

Expand Down Expand Up @@ -333,7 +333,7 @@
let ctx = MCTPSMBusContextResponse::new(SOURCE_ID);

let header = ctx.generate_transport_header(DEST_ID);
let buf = header.0;
let buf = header.to_bytes();

// HDR version and reserved field
assert_eq!(buf[0], HDR_VERSION);
Expand Down
Loading