Skip to content

Commit aba9add

Browse files
committed
fix bug
1 parent e9b66ea commit aba9add

File tree

3 files changed

+78
-2
lines changed

3 files changed

+78
-2
lines changed

src/iface/interface/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1201,7 +1201,7 @@ impl InterfaceInner {
12011201
#[cfg(feature = "proto-ipv4")]
12021202
IpRepr::Ipv4(repr) => {
12031203
// If we have an IPv4 packet, then we need to check if we need to fragment it.
1204-
if total_ip_len > self.caps.max_transmission_unit {
1204+
if total_ip_len > self.caps.ip_mtu() {
12051205
#[cfg(feature = "proto-ipv4-fragmentation")]
12061206
{
12071207
net_debug!("start fragmentation");

src/iface/interface/tests/ipv4.rs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,82 @@ fn test_handle_igmp(#[case] medium: Medium) {
759759
}
760760
}
761761

762+
#[rstest]
763+
#[case(Medium::Ip)]
764+
#[cfg(all(feature = "proto-ipv4-fragmentation", feature = "medium-ip"))]
765+
#[case(Medium::Ethernet)]
766+
#[cfg(all(feature = "proto-ipv4-fragmentation", feature = "medium-ethernet"))]
767+
fn test_packet_len(#[case] medium: Medium) {
768+
use crate::config::FRAGMENTATION_BUFFER_SIZE;
769+
770+
let (mut iface, _, _) = setup(medium);
771+
772+
struct TestTxToken {
773+
max_transmission_unit: usize,
774+
}
775+
776+
impl TxToken for TestTxToken {
777+
fn consume<R, F>(self, len: usize, f: F) -> R
778+
where
779+
F: FnOnce(&mut [u8]) -> R,
780+
{
781+
net_debug!("TxToken get len: {}", len);
782+
assert!(len <= self.max_transmission_unit);
783+
let mut junk = [0; 1536];
784+
f(&mut junk[..len])
785+
}
786+
}
787+
788+
iface.inner.neighbor_cache.fill(
789+
IpAddress::Ipv4(Ipv4Address::new(127, 0, 0, 1)),
790+
HardwareAddress::Ethernet(EthernetAddress::from_bytes(&[
791+
0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
792+
])),
793+
Instant::ZERO,
794+
);
795+
796+
for ip_packet_len in [
797+
100,
798+
iface.inner.ip_mtu(),
799+
iface.inner.ip_mtu() + 1,
800+
FRAGMENTATION_BUFFER_SIZE,
801+
] {
802+
net_debug!("ip_packet_len: {}", ip_packet_len);
803+
804+
let mut ip_repr = Ipv4Repr {
805+
src_addr: Ipv4Address::new(127, 0, 0, 1),
806+
dst_addr: Ipv4Address::new(127, 0, 0, 1),
807+
next_header: IpProtocol::Udp,
808+
payload_len: 0,
809+
hop_limit: 64,
810+
};
811+
let udp_repr = UdpRepr {
812+
src_port: 12345,
813+
dst_port: 54321,
814+
};
815+
816+
let ip_packet_payload_len = ip_packet_len - ip_repr.buffer_len();
817+
let udp_packet_payload_len = ip_packet_payload_len - udp_repr.header_len();
818+
ip_repr.payload_len = ip_packet_payload_len;
819+
820+
let udp_packet_payload = vec![1; udp_packet_payload_len];
821+
let ip_payload = IpPayload::Udp(udp_repr, &udp_packet_payload);
822+
let ip_packet = Packet::new_ipv4(ip_repr, ip_payload);
823+
824+
assert_eq!(
825+
iface.inner.dispatch_ip(
826+
TestTxToken {
827+
max_transmission_unit: iface.inner.caps.max_transmission_unit
828+
},
829+
PacketMeta::default(),
830+
ip_packet,
831+
&mut iface.fragmenter,
832+
),
833+
Ok(())
834+
);
835+
}
836+
}
837+
762838
#[rstest]
763839
#[case(Medium::Ip)]
764840
#[cfg(all(feature = "socket-raw", feature = "medium-ip"))]

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ pub mod config {
136136
pub const DNS_MAX_NAME_SIZE: usize = 255;
137137
pub const DNS_MAX_RESULT_COUNT: usize = 1;
138138
pub const DNS_MAX_SERVER_COUNT: usize = 1;
139-
pub const FRAGMENTATION_BUFFER_SIZE: usize = 1500;
139+
pub const FRAGMENTATION_BUFFER_SIZE: usize = 4096;
140140
pub const IFACE_MAX_ADDR_COUNT: usize = 8;
141141
pub const IFACE_MAX_MULTICAST_GROUP_COUNT: usize = 4;
142142
pub const IFACE_MAX_ROUTE_COUNT: usize = 4;

0 commit comments

Comments
 (0)