From c0d3c78e522eecd8f0ee141af82ebcdfebadf515 Mon Sep 17 00:00:00 2001 From: Yureka Date: Mon, 4 Apr 2022 11:11:55 +0200 Subject: [PATCH 1/3] fix num_bytes calculation --- pnet_macros/src/util.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/pnet_macros/src/util.rs b/pnet_macros/src/util.rs index 1fa64d1c..c2ce4b23 100644 --- a/pnet_macros/src/util.rs +++ b/pnet_macros/src/util.rs @@ -382,12 +382,10 @@ pub fn operations(offset: usize, size: usize) -> Option> { return None; } - let num_full_bytes = size / 8; - let num_bytes = if offset > 0 || size % 8 != 0 { - num_full_bytes + 1 - } else { - num_full_bytes - }; + + let start = offset / 8; + let end = (offset+size-1) / 8; + let num_bytes = (end - start) + 1; let mut current_offset = offset; let mut num_bits_remaining = size; From b9a117613a747e2c5d3a83ba27da6616d5e162fa Mon Sep 17 00:00:00 2001 From: Yureka Date: Mon, 4 Apr 2022 11:12:11 +0200 Subject: [PATCH 2/3] add test for operations(6, 6) --- pnet_macros/src/util.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pnet_macros/src/util.rs b/pnet_macros/src/util.rs index c2ce4b23..49868e81 100644 --- a/pnet_macros/src/util.rs +++ b/pnet_macros/src/util.rs @@ -625,6 +625,22 @@ fn operations_test() { } ] ); + + assert_eq!( + operations(6, 6).unwrap(), + vec![ + Op { + mask: 3, + shiftl: 4, + shiftr: 0, + }, + Op { + mask: 240, + shiftl: 0, + shiftr: 4, + } + ] + ); } /// Mask `bits` bits of a byte. eg. mask_high_bits(2) == 0b00000011 From 3daa033580bd25baaf09cb4d2cee5c0a720a54fa Mon Sep 17 00:00:00 2001 From: Yureka Date: Fri, 8 Apr 2022 16:16:36 +0200 Subject: [PATCH 3/3] add new run-pass test weird_field_pos --- pnet_macros/tests/run-pass/weird_field_pos.rs | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 pnet_macros/tests/run-pass/weird_field_pos.rs diff --git a/pnet_macros/tests/run-pass/weird_field_pos.rs b/pnet_macros/tests/run-pass/weird_field_pos.rs new file mode 100644 index 00000000..99b4897a --- /dev/null +++ b/pnet_macros/tests/run-pass/weird_field_pos.rs @@ -0,0 +1,40 @@ +// Copyright (c) 2022 Yureka +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +extern crate pnet_macros; +extern crate pnet_macros_support; +use pnet_macros::packet; +use pnet_macros_support::types::*; + +#[packet] +pub struct Test { + banana: u2, + apple: u4, + potato: u6, + the_rest: u20be, + #[payload] + payload: Vec, +} + +fn main() { + let test = Test { + banana: 0b10, + apple: 0b1010, + potato: 0b101010, + the_rest: 0b10101010101010101010, + payload: vec![], + }; + + let mut buf = vec![0; TestPacket::packet_size(&test)]; + let mut packet = MutableTestPacket::new(&mut buf).unwrap(); + packet.populate(&test); + assert_eq!(packet.get_banana(), test.banana); + assert_eq!(packet.get_apple(), test.apple); + assert_eq!(packet.get_potato(), test.potato); + assert_eq!(packet.get_the_rest(), test.the_rest); +}