Expose IEEE802.15.4 address in Driver

This commit is contained in:
Ruben De Smet 2023-07-28 15:54:31 +02:00
parent d752a3f980
commit c52d1d11f9
No known key found for this signature in database
GPG Key ID: 1AE26A210C14115B
2 changed files with 21 additions and 0 deletions

View File

@ -43,6 +43,7 @@ struct Shared {
link_state: LinkState, link_state: LinkState,
waker: WakerRegistration, waker: WakerRegistration,
ethernet_address: [u8; 6], ethernet_address: [u8; 6],
ieee802154_address: [u8; 8],
} }
pub struct Runner<'d, const MTU: usize> { pub struct Runner<'d, const MTU: usize> {
@ -93,6 +94,14 @@ impl<'d, const MTU: usize> Runner<'d, MTU> {
}); });
} }
pub fn set_ieee802154_address(&mut self, address: [u8; 8]) {
self.shared.lock(|s| {
let s = &mut *s.borrow_mut();
s.ieee802154_address = address;
s.waker.wake();
});
}
pub async fn rx_buf(&mut self) -> &mut [u8] { pub async fn rx_buf(&mut self) -> &mut [u8] {
let p = self.rx_chan.send().await; let p = self.rx_chan.send().await;
&mut p.buf &mut p.buf
@ -207,6 +216,7 @@ impl<'d, const MTU: usize> TxRunner<'d, MTU> {
pub fn new<'d, const MTU: usize, const N_RX: usize, const N_TX: usize>( pub fn new<'d, const MTU: usize, const N_RX: usize, const N_TX: usize>(
state: &'d mut State<MTU, N_RX, N_TX>, state: &'d mut State<MTU, N_RX, N_TX>,
ethernet_address: [u8; 6], ethernet_address: [u8; 6],
ieee802154_address: [u8; 8],
) -> (Runner<'d, MTU>, Device<'d, MTU>) { ) -> (Runner<'d, MTU>, Device<'d, MTU>) {
let mut caps = Capabilities::default(); let mut caps = Capabilities::default();
caps.max_transmission_unit = MTU; caps.max_transmission_unit = MTU;
@ -223,6 +233,7 @@ pub fn new<'d, const MTU: usize, const N_RX: usize, const N_TX: usize>(
shared: Mutex::new(RefCell::new(Shared { shared: Mutex::new(RefCell::new(Shared {
link_state: LinkState::Down, link_state: LinkState::Down,
ethernet_address, ethernet_address,
ieee802154_address,
waker: WakerRegistration::new(), waker: WakerRegistration::new(),
})), })),
}); });
@ -293,6 +304,10 @@ impl<'d, const MTU: usize> embassy_net_driver::Driver for Device<'d, MTU> {
self.shared.lock(|s| s.borrow().ethernet_address) self.shared.lock(|s| s.borrow().ethernet_address)
} }
fn ieee802154_address(&self) -> [u8; 8] {
self.shared.lock(|s| s.borrow().ieee802154_address)
}
fn link_state(&mut self, cx: &mut Context) -> LinkState { fn link_state(&mut self, cx: &mut Context) -> LinkState {
self.shared.lock(|s| { self.shared.lock(|s| {
let s = &mut *s.borrow_mut(); let s = &mut *s.borrow_mut();

View File

@ -53,6 +53,9 @@ pub trait Driver {
/// Get the device's Ethernet address. /// Get the device's Ethernet address.
fn ethernet_address(&self) -> [u8; 6]; fn ethernet_address(&self) -> [u8; 6];
/// Get the device's IEEE 802.15.4 address.
fn ieee802154_address(&self) -> [u8; 8];
} }
impl<T: ?Sized + Driver> Driver for &mut T { impl<T: ?Sized + Driver> Driver for &mut T {
@ -78,6 +81,9 @@ impl<T: ?Sized + Driver> Driver for &mut T {
fn ethernet_address(&self) -> [u8; 6] { fn ethernet_address(&self) -> [u8; 6] {
T::ethernet_address(self) T::ethernet_address(self)
} }
fn ieee802154_address(&self) -> [u8; 8] {
T::ieee802154_address(self)
}
} }
/// A token to receive a single network packet. /// A token to receive a single network packet.