Browse Source

iface: use heapless LinearMap for ipv4_multicast_groups

Dario Nieuwenhuis 2 years ago
parent
commit
94a52d8baf
3 changed files with 18 additions and 22 deletions
  1. 0 2
      examples/multicast.rs
  2. 14 12
      src/iface/interface/mod.rs
  3. 4 8
      src/iface/interface/tests.rs

+ 0 - 2
examples/multicast.rs

@@ -35,12 +35,10 @@ fn main() {
     let ip_addr = IpCidr::new(IpAddress::from(local_addr), 24);
     let mut ip_addrs = heapless::Vec::<IpCidr, 5>::new();
     ip_addrs.push(ip_addr).unwrap();
-    let mut ipv4_multicast_storage = [None; 1];
     let mut iface = InterfaceBuilder::new()
         .hardware_addr(ethernet_addr.into())
         .neighbor_cache(neighbor_cache)
         .ip_addrs(ip_addrs)
-        .ipv4_multicast_groups(&mut ipv4_multicast_storage[..])
         .finalize(&mut device);
 
     let now = Instant::now();

+ 14 - 12
src/iface/interface/mod.rs

@@ -17,8 +17,8 @@ mod ipv6;
 
 use core::cmp;
 use core::marker::PhantomData;
-use heapless::Vec;
-use managed::{ManagedMap, ManagedSlice};
+use heapless::{LinearMap, Vec};
+use managed::ManagedSlice;
 
 #[cfg(any(feature = "proto-ipv4", feature = "proto-sixlowpan"))]
 use super::fragmentation::PacketAssemblerSet;
@@ -35,7 +35,9 @@ use crate::time::{Duration, Instant};
 use crate::wire::*;
 use crate::{Error, Result};
 
-const MAX_IP_ADDRS_NUM: usize = 5;
+const MAX_IP_ADDR_COUNT: usize = 5;
+#[cfg(feature = "proto-igmp")]
+const MAX_IPV4_MULTICAST_GROUPS: usize = 4;
 
 pub(crate) struct FragmentsBuffer<'a> {
     #[cfg(feature = "proto-ipv4-fragmentation")]
@@ -275,12 +277,12 @@ pub struct InterfaceInner<'a> {
     sixlowpan_address_context: &'a [SixlowpanAddressContext<'a>],
     #[cfg(feature = "proto-sixlowpan-fragmentation")]
     tag: u16,
-    ip_addrs: Vec<IpCidr, MAX_IP_ADDRS_NUM>,
+    ip_addrs: Vec<IpCidr, MAX_IP_ADDR_COUNT>,
     #[cfg(feature = "proto-ipv4")]
     any_ip: bool,
     routes: Routes,
     #[cfg(feature = "proto-igmp")]
-    ipv4_multicast_groups: ManagedMap<'a, Ipv4Address, ()>,
+    ipv4_multicast_groups: LinearMap<Ipv4Address, (), MAX_IPV4_MULTICAST_GROUPS>,
     /// When to report for (all or) the next multicast group membership via IGMP
     #[cfg(feature = "proto-igmp")]
     igmp_report_state: IgmpReportState,
@@ -296,13 +298,13 @@ pub struct InterfaceBuilder<'a> {
     neighbor_cache: Option<NeighborCache>,
     #[cfg(feature = "medium-ieee802154")]
     pan_id: Option<Ieee802154Pan>,
-    ip_addrs: Vec<IpCidr, MAX_IP_ADDRS_NUM>,
+    ip_addrs: Vec<IpCidr, MAX_IP_ADDR_COUNT>,
     #[cfg(feature = "proto-ipv4")]
     any_ip: bool,
     routes: Routes,
     /// Does not share storage with `ipv6_multicast_groups` to avoid IPv6 size overhead.
     #[cfg(feature = "proto-igmp")]
-    ipv4_multicast_groups: ManagedMap<'a, Ipv4Address, ()>,
+    ipv4_multicast_groups: LinearMap<Ipv4Address, (), MAX_IPV4_MULTICAST_GROUPS>,
     random_seed: u64,
 
     #[cfg(feature = "proto-ipv4-fragmentation")]
@@ -380,7 +382,7 @@ let iface = builder.finalize(&mut device);
             any_ip: false,
             routes: Routes::new(),
             #[cfg(feature = "proto-igmp")]
-            ipv4_multicast_groups: ManagedMap::Borrowed(&mut []),
+            ipv4_multicast_groups: LinearMap::new(),
             random_seed: 0,
 
             #[cfg(feature = "proto-ipv4-fragmentation")]
@@ -443,7 +445,7 @@ let iface = builder.finalize(&mut device);
     /// [ip_addrs]: struct.Interface.html#method.ip_addrs
     pub fn ip_addrs<T>(mut self, ip_addrs: T) -> Self
     where
-        T: Into<Vec<IpCidr, MAX_IP_ADDRS_NUM>>,
+        T: Into<Vec<IpCidr, MAX_IP_ADDR_COUNT>>,
     {
         let ip_addrs = ip_addrs.into();
         InterfaceInner::check_ip_addrs(&ip_addrs);
@@ -495,7 +497,7 @@ let iface = builder.finalize(&mut device);
     #[cfg(feature = "proto-igmp")]
     pub fn ipv4_multicast_groups<T>(mut self, ipv4_multicast_groups: T) -> Self
     where
-        T: Into<ManagedMap<'a, Ipv4Address, ()>>,
+        T: Into<LinearMap<Ipv4Address, (), MAX_IPV4_MULTICAST_GROUPS>>,
     {
         self.ipv4_multicast_groups = ipv4_multicast_groups.into();
         self
@@ -1014,7 +1016,7 @@ impl<'a> Interface<'a> {
     ///
     /// # Panics
     /// This function panics if any of the addresses are not unicast.
-    pub fn update_ip_addrs<F: FnOnce(&mut Vec<IpCidr, MAX_IP_ADDRS_NUM>)>(&mut self, f: F) {
+    pub fn update_ip_addrs<F: FnOnce(&mut Vec<IpCidr, MAX_IP_ADDR_COUNT>)>(&mut self, f: F) {
         f(&mut self.inner.ip_addrs);
         InterfaceInner::flush_cache(&mut self.inner);
         InterfaceInner::check_ip_addrs(&self.inner.ip_addrs)
@@ -1615,7 +1617,7 @@ impl<'a> InterfaceInner<'a> {
             #[cfg(feature = "proto-igmp")]
             igmp_report_state: IgmpReportState::Inactive,
             #[cfg(feature = "proto-igmp")]
-            ipv4_multicast_groups: ManagedMap::Borrowed(&mut []),
+            ipv4_multicast_groups: LinearMap::new(),
         }
     }
 

+ 4 - 8
src/iface/interface/tests.rs

@@ -42,7 +42,7 @@ fn create<'a>(medium: Medium) -> (Interface<'a>, SocketSet<'a>, Loopback) {
 fn create_ip<'a>() -> (Interface<'a>, SocketSet<'a>, Loopback) {
     // Create a basic device
     let mut device = Loopback::new(Medium::Ip);
-    let mut ip_addrs = heapless::Vec::<IpCidr, MAX_IP_ADDRS_NUM>::new();
+    let mut ip_addrs = heapless::Vec::<IpCidr, MAX_IP_ADDR_COUNT>::new();
     #[cfg(feature = "proto-ipv4")]
     ip_addrs
         .push(IpCidr::new(IpAddress::v4(127, 0, 0, 1), 8))
@@ -63,8 +63,6 @@ fn create_ip<'a>() -> (Interface<'a>, SocketSet<'a>, Loopback) {
         .ipv4_reassembly_buffer(PacketAssemblerSet::new(vec![], BTreeMap::new()))
         .ipv4_fragmentation_buffer(vec![]);
 
-    #[cfg(feature = "proto-igmp")]
-    let iface_builder = iface_builder.ipv4_multicast_groups(BTreeMap::new());
     let iface = iface_builder.finalize(&mut device);
 
     (iface, SocketSet::new(vec![]), device)
@@ -74,7 +72,7 @@ fn create_ip<'a>() -> (Interface<'a>, SocketSet<'a>, Loopback) {
 fn create_ethernet<'a>() -> (Interface<'a>, SocketSet<'a>, Loopback) {
     // Create a basic device
     let mut device = Loopback::new(Medium::Ethernet);
-    let mut ip_addrs = heapless::Vec::<IpCidr, MAX_IP_ADDRS_NUM>::new();
+    let mut ip_addrs = heapless::Vec::<IpCidr, MAX_IP_ADDR_COUNT>::new();
     #[cfg(feature = "proto-ipv4")]
     ip_addrs
         .push(IpCidr::new(IpAddress::v4(127, 0, 0, 1), 8))
@@ -103,8 +101,6 @@ fn create_ethernet<'a>() -> (Interface<'a>, SocketSet<'a>, Loopback) {
         .ipv4_reassembly_buffer(PacketAssemblerSet::new(vec![], BTreeMap::new()))
         .ipv4_fragmentation_buffer(vec![]);
 
-    #[cfg(feature = "proto-igmp")]
-    let iface_builder = iface_builder.ipv4_multicast_groups(BTreeMap::new());
     let iface = iface_builder.finalize(&mut device);
 
     (iface, SocketSet::new(vec![]), device)
@@ -114,7 +110,7 @@ fn create_ethernet<'a>() -> (Interface<'a>, SocketSet<'a>, Loopback) {
 fn create_ieee802154<'a>() -> (Interface<'a>, SocketSet<'a>, Loopback) {
     // Create a basic device
     let mut device = Loopback::new(Medium::Ieee802154);
-    let mut ip_addrs = heapless::Vec::<IpCidr, MAX_IP_ADDRS_NUM>::new();
+    let mut ip_addrs = heapless::Vec::<IpCidr, MAX_IP_ADDR_COUNT>::new();
     #[cfg(feature = "proto-ipv6")]
     ip_addrs
         .push(IpCidr::new(IpAddress::v6(0, 0, 0, 0, 0, 0, 0, 1), 128))
@@ -1063,7 +1059,7 @@ fn test_icmpv4_socket() {
 #[cfg(feature = "proto-ipv6")]
 fn test_solicited_node_addrs() {
     let (mut iface, _, _device) = create(MEDIUM);
-    let mut new_addrs = heapless::Vec::<IpCidr, MAX_IP_ADDRS_NUM>::new();
+    let mut new_addrs = heapless::Vec::<IpCidr, MAX_IP_ADDR_COUNT>::new();
     new_addrs
         .push(IpCidr::new(IpAddress::v6(0xfe80, 0, 0, 0, 1, 2, 0, 2), 64))
         .unwrap();