Skip to content

Commit 8be46b9

Browse files
authored
Merge pull request #966 from korken89/neighbor-cache-expiry-fix
Reset expiry of entries in the neighbor cache on packet reception
2 parents 53caf70 + 8e97c95 commit 8be46b9

File tree

12 files changed

+105
-10
lines changed

12 files changed

+105
-10
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,11 @@ iface-max-sixlowpan-address-context-count-1024 = []
151151
iface-neighbor-cache-count-1 = []
152152
iface-neighbor-cache-count-2 = []
153153
iface-neighbor-cache-count-3 = []
154-
iface-neighbor-cache-count-4 = [] # Default
154+
iface-neighbor-cache-count-4 = []
155155
iface-neighbor-cache-count-5 = []
156156
iface-neighbor-cache-count-6 = []
157157
iface-neighbor-cache-count-7 = []
158-
iface-neighbor-cache-count-8 = []
158+
iface-neighbor-cache-count-8 = [] # Default
159159
iface-neighbor-cache-count-16 = []
160160
iface-neighbor-cache-count-32 = []
161161
iface-neighbor-cache-count-64 = []

build.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ static CONFIGS: &[(&str, usize)] = &[
99
("IFACE_MAX_ADDR_COUNT", 2),
1010
("IFACE_MAX_MULTICAST_GROUP_COUNT", 4),
1111
("IFACE_MAX_SIXLOWPAN_ADDRESS_CONTEXT_COUNT", 4),
12-
("IFACE_NEIGHBOR_CACHE_COUNT", 4),
12+
("IFACE_NEIGHBOR_CACHE_COUNT", 8),
1313
("IFACE_MAX_ROUTE_COUNT", 2),
1414
("FRAGMENTATION_BUFFER_SIZE", 1500),
1515
("ASSEMBLER_MAX_SEGMENT_COUNT", 4),

gen_config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def feature(name, default, min, max, pow2=None):
3030
feature("iface_max_addr_count", default=2, min=1, max=8)
3131
feature("iface_max_multicast_group_count", default=4, min=1, max=1024, pow2=8)
3232
feature("iface_max_sixlowpan_address_context_count", default=4, min=1, max=1024, pow2=8)
33-
feature("iface_neighbor_cache_count", default=4, min=1, max=1024, pow2=8)
33+
feature("iface_neighbor_cache_count", default=8, min=1, max=1024, pow2=8)
3434
feature("iface_max_route_count", default=2, min=1, max=1024, pow2=8)
3535
feature("fragmentation_buffer_size", default=1500, min=256, max=65536, pow2=True)
3636
feature("assembler_max_segment_count", default=4, min=1, max=32, pow2=4)

src/iface/interface/ethernet.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,19 @@ impl InterfaceInner {
2525
EthernetProtocol::Ipv4 => {
2626
let ipv4_packet = check!(Ipv4Packet::new_checked(eth_frame.payload()));
2727

28-
self.process_ipv4(sockets, meta, &ipv4_packet, fragments)
29-
.map(EthernetPacket::Ip)
28+
self.process_ipv4(
29+
sockets,
30+
meta,
31+
eth_frame.src_addr().into(),
32+
&ipv4_packet,
33+
fragments,
34+
)
35+
.map(EthernetPacket::Ip)
3036
}
3137
#[cfg(feature = "proto-ipv6")]
3238
EthernetProtocol::Ipv6 => {
3339
let ipv6_packet = check!(Ipv6Packet::new_checked(eth_frame.payload()));
34-
self.process_ipv6(sockets, meta, &ipv6_packet)
40+
self.process_ipv6(sockets, meta, eth_frame.src_addr().into(), &ipv6_packet)
3541
.map(EthernetPacket::Ip)
3642
}
3743
// Drop all other traffic.

src/iface/interface/ipv4.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ impl InterfaceInner {
9191
&mut self,
9292
sockets: &mut SocketSet,
9393
meta: PacketMeta,
94+
source_hardware_addr: HardwareAddress,
9495
ipv4_packet: &Ipv4Packet<&'a [u8]>,
9596
frag: &'a mut FragmentsBuffer,
9697
) -> Option<Packet<'a>> {
@@ -196,6 +197,15 @@ impl InterfaceInner {
196197
}
197198
}
198199

200+
#[cfg(feature = "medium-ethernet")]
201+
if self.is_unicast_v4(ipv4_repr.dst_addr) {
202+
self.neighbor_cache.reset_expiry_if_existing(
203+
IpAddress::Ipv4(ipv4_repr.src_addr),
204+
source_hardware_addr,
205+
self.now,
206+
);
207+
}
208+
199209
match ipv4_repr.next_header {
200210
IpProtocol::Icmp => self.process_icmpv4(sockets, ipv4_repr, ip_payload),
201211

src/iface/interface/ipv6.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ impl InterfaceInner {
187187
&mut self,
188188
sockets: &mut SocketSet,
189189
meta: PacketMeta,
190+
source_hardware_addr: HardwareAddress,
190191
ipv6_packet: &Ipv6Packet<&'frame [u8]>,
191192
) -> Option<Packet<'frame>> {
192193
let ipv6_repr = check!(Ipv6Repr::parse(ipv6_packet));
@@ -228,6 +229,15 @@ impl InterfaceInner {
228229
#[cfg(not(feature = "socket-raw"))]
229230
let handled_by_raw_socket = false;
230231

232+
#[cfg(any(feature = "medium-ethernet", feature = "medium-ieee802154"))]
233+
if ipv6_repr.dst_addr.is_unicast() {
234+
self.neighbor_cache.reset_expiry_if_existing(
235+
IpAddress::Ipv6(ipv6_repr.src_addr),
236+
source_hardware_addr,
237+
self.now,
238+
);
239+
}
240+
231241
self.process_nxt_hdr(
232242
sockets,
233243
meta,

src/iface/interface/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -785,12 +785,12 @@ impl InterfaceInner {
785785
Ok(IpVersion::Ipv4) => {
786786
let ipv4_packet = check!(Ipv4Packet::new_checked(ip_payload));
787787

788-
self.process_ipv4(sockets, meta, &ipv4_packet, frag)
788+
self.process_ipv4(sockets, meta, HardwareAddress::Ip, &ipv4_packet, frag)
789789
}
790790
#[cfg(feature = "proto-ipv6")]
791791
Ok(IpVersion::Ipv6) => {
792792
let ipv6_packet = check!(Ipv6Packet::new_checked(ip_payload));
793-
self.process_ipv6(sockets, meta, &ipv6_packet)
793+
self.process_ipv6(sockets, meta, HardwareAddress::Ip, &ipv6_packet)
794794
}
795795
// Drop all other traffic.
796796
_ => None,

src/iface/interface/sixlowpan.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,15 @@ impl InterfaceInner {
9999
}
100100
};
101101

102-
self.process_ipv6(sockets, meta, &check!(Ipv6Packet::new_checked(payload)))
102+
self.process_ipv6(
103+
sockets,
104+
meta,
105+
match ieee802154_repr.src_addr {
106+
Some(s) => HardwareAddress::Ieee802154(s),
107+
None => HardwareAddress::Ieee802154(Ieee802154Address::Absent),
108+
},
109+
&check!(Ipv6Packet::new_checked(payload)),
110+
)
103111
}
104112

105113
#[cfg(feature = "proto-sixlowpan-fragmentation")]

src/iface/interface/tests/ipv4.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ fn test_no_icmp_no_unicast(#[case] medium: Medium) {
9191
iface.inner.process_ipv4(
9292
&mut sockets,
9393
PacketMeta::default(),
94+
HardwareAddress::default(),
9495
&frame,
9596
&mut iface.fragments
9697
),
@@ -152,6 +153,7 @@ fn test_icmp_error_no_payload(#[case] medium: Medium) {
152153
iface.inner.process_ipv4(
153154
&mut sockets,
154155
PacketMeta::default(),
156+
HardwareAddress::default(),
155157
&frame,
156158
&mut iface.fragments
157159
),
@@ -397,6 +399,7 @@ fn test_handle_ipv4_broadcast(#[case] medium: Medium) {
397399
iface.inner.process_ipv4(
398400
&mut sockets,
399401
PacketMeta::default(),
402+
HardwareAddress::default(),
400403
&frame,
401404
&mut iface.fragments
402405
),
@@ -828,6 +831,7 @@ fn test_raw_socket_no_reply(#[case] medium: Medium) {
828831
iface.inner.process_ipv4(
829832
&mut sockets,
830833
PacketMeta::default(),
834+
HardwareAddress::default(),
831835
&frame,
832836
&mut iface.fragments
833837
),
@@ -925,6 +929,7 @@ fn test_raw_socket_with_udp_socket(#[case] medium: Medium) {
925929
iface.inner.process_ipv4(
926930
&mut sockets,
927931
PacketMeta::default(),
932+
HardwareAddress::default(),
928933
&frame,
929934
&mut iface.fragments
930935
),

src/iface/interface/tests/ipv6.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ fn any_ip(#[case] medium: Medium) {
8686
iface.inner.process_ipv6(
8787
&mut sockets,
8888
PacketMeta::default(),
89+
HardwareAddress::default(),
8990
&Ipv6Packet::new_checked(&data[..]).unwrap()
9091
),
9192
None
@@ -98,6 +99,7 @@ fn any_ip(#[case] medium: Medium) {
9899
.process_ipv6(
99100
&mut sockets,
100101
PacketMeta::default(),
102+
HardwareAddress::default(),
101103
&Ipv6Packet::new_checked(&data[..]).unwrap()
102104
)
103105
.is_some());
@@ -125,6 +127,7 @@ fn multicast_source_address(#[case] medium: Medium) {
125127
iface.inner.process_ipv6(
126128
&mut sockets,
127129
PacketMeta::default(),
130+
HardwareAddress::default(),
128131
&Ipv6Packet::new_checked(&data[..]).unwrap()
129132
),
130133
response
@@ -173,6 +176,7 @@ fn hop_by_hop_skip_with_icmp(#[case] medium: Medium) {
173176
iface.inner.process_ipv6(
174177
&mut sockets,
175178
PacketMeta::default(),
179+
HardwareAddress::default(),
176180
&Ipv6Packet::new_checked(&data[..]).unwrap()
177181
),
178182
response
@@ -208,6 +212,7 @@ fn hop_by_hop_discard_with_icmp(#[case] medium: Medium) {
208212
iface.inner.process_ipv6(
209213
&mut sockets,
210214
PacketMeta::default(),
215+
HardwareAddress::default(),
211216
&Ipv6Packet::new_checked(&data[..]).unwrap()
212217
),
213218
response
@@ -262,6 +267,7 @@ fn hop_by_hop_discard_param_problem(#[case] medium: Medium) {
262267
iface.inner.process_ipv6(
263268
&mut sockets,
264269
PacketMeta::default(),
270+
HardwareAddress::default(),
265271
&Ipv6Packet::new_checked(&data[..]).unwrap()
266272
),
267273
response
@@ -319,6 +325,7 @@ fn hop_by_hop_discard_with_multicast(#[case] medium: Medium) {
319325
iface.inner.process_ipv6(
320326
&mut sockets,
321327
PacketMeta::default(),
328+
HardwareAddress::default(),
322329
&Ipv6Packet::new_checked(&data[..]).unwrap()
323330
),
324331
response
@@ -378,6 +385,7 @@ fn imcp_empty_echo_request(#[case] medium: Medium) {
378385
iface.inner.process_ipv6(
379386
&mut sockets,
380387
PacketMeta::default(),
388+
HardwareAddress::default(),
381389
&Ipv6Packet::new_checked(&data[..]).unwrap()
382390
),
383391
response
@@ -438,6 +446,7 @@ fn icmp_echo_request(#[case] medium: Medium) {
438446
iface.inner.process_ipv6(
439447
&mut sockets,
440448
PacketMeta::default(),
449+
HardwareAddress::default(),
441450
&Ipv6Packet::new_checked(&data[..]).unwrap()
442451
),
443452
response
@@ -485,6 +494,7 @@ fn icmp_echo_reply_as_input(#[case] medium: Medium) {
485494
iface.inner.process_ipv6(
486495
&mut sockets,
487496
PacketMeta::default(),
497+
HardwareAddress::default(),
488498
&Ipv6Packet::new_checked(&data[..]).unwrap()
489499
),
490500
response
@@ -533,6 +543,7 @@ fn unknown_proto_with_multicast_dst_address(#[case] medium: Medium) {
533543
iface.inner.process_ipv6(
534544
&mut sockets,
535545
PacketMeta::default(),
546+
HardwareAddress::default(),
536547
&Ipv6Packet::new_checked(&data[..]).unwrap()
537548
),
538549
response
@@ -582,6 +593,7 @@ fn unknown_proto(#[case] medium: Medium) {
582593
iface.inner.process_ipv6(
583594
&mut sockets,
584595
PacketMeta::default(),
596+
HardwareAddress::default(),
585597
&Ipv6Packet::new_checked(&data[..]).unwrap()
586598
),
587599
response
@@ -626,6 +638,7 @@ fn ndsic_neighbor_advertisement_ethernet(#[case] medium: Medium) {
626638
iface.inner.process_ipv6(
627639
&mut sockets,
628640
PacketMeta::default(),
641+
HardwareAddress::default(),
629642
&Ipv6Packet::new_checked(&data[..]).unwrap()
630643
),
631644
response
@@ -682,6 +695,7 @@ fn ndsic_neighbor_advertisement_ethernet_multicast_addr(#[case] medium: Medium)
682695
iface.inner.process_ipv6(
683696
&mut sockets,
684697
PacketMeta::default(),
698+
HardwareAddress::default(),
685699
&Ipv6Packet::new_checked(&data[..]).unwrap()
686700
),
687701
response
@@ -734,6 +748,7 @@ fn ndsic_neighbor_advertisement_ieee802154(#[case] medium: Medium) {
734748
iface.inner.process_ipv6(
735749
&mut sockets,
736750
PacketMeta::default(),
751+
HardwareAddress::default(),
737752
&Ipv6Packet::new_checked(&data[..]).unwrap()
738753
),
739754
response

0 commit comments

Comments
 (0)