Cannot send arbitrarily long messages via sockets

Viewed 67

I'm writing a traceroute implementation and I'm deliberately trying to send a long message for the purposes of path maximum transmission unit detection. However, when I try to send something longer than 1500 bytes, I get:

thread 'tokio-runtime-worker' panicked at 'called `Result::unwrap()` on an `Err` value: Os { code: 90, kind: Uncategorized, message: "Message too long" }', src/main.rs:115:26

I'm expecting to see a Fragmentation needed ICMP message.

The socket comes from the raw-socket crate.

It seems that PMTU is hard-coded somewhere deep. Or am I misdiagnosing this? What would prevent me from sending arbitrarily long messages via sockets?

MCVE:

use raw_socket::{RawSocket, Domain, Protocol, Type};
use raw_socket::option::{Level, Name};
use raw_socket::ffi::c_int;

fn main() {
    let sock = RawSocket::new(Domain::ipv4(), Type::raw(), Protocol::from(255).into()).unwrap();
    let buf = [0u8; 9000];
    const IP_MTU_DISCOVER: i32 = 10;
    const IP_PMTU_DISC_PROBE: i32 = 3;
    
    sock.set_sockopt(Level::IPV4, Name::from(IP_MTU_DISCOVER), &(IP_PMTU_DISC_PROBE as c_int))
        .unwrap();
    
    sock.send_to(&buf, "142.250.201.206:33434").unwrap();
}
0 Answers
Related