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();
}