lo haces con la llamada setsockopt()
, mediante el uso de la opción IP_DONTFRAG
::
int val = 1;
setsockopt(sd, IPPROTO_IP, IP_DONTFRAG, &val, sizeof(val));
Here's una página que explica esto con más detalle.
Para Linux, parece que tiene que utilizar la opción IP_MTU_DISCOVER
con el valor IP_PMTUDISC_DO
(o IP_PMTUDISC_DONT
para apagarlo):
int val = IP_PMTUDISC_DO;
setsockopt(sd, IPPROTO_IP, IP_MTU_DISCOVER, &val, sizeof(val));
no he probado esto, sólo se veía en los archivos de cabecera y un poco de una búsqueda web, así que tendrás que probarlo.
En cuanto a si hay otra forma de la bandera DF se podría establecer:
I find nowhere in my program where the "force DF flag" is set, yet tcpdump
suggests it is. Is there any other way this could get set?
De esta excelente página here:
IP_MTU_DISCOVER:
Sets or receives the Path MTU Discovery setting for a socket. When enabled, Linux will perform Path MTU Discovery as defined in RFC 1191 on this socket. The don't fragment flag is set on all outgoing datagrams. The system-wide default is controlled by the ip_no_pmtu_disc
sysctl
for SOCK_STREAM
sockets, and disabled on all others. For non SOCK_STREAM
sockets it is the user's responsibility to packetize the data in MTU sized chunks and to do the retransmits if necessary. The kernel will reject packets that are bigger than the known path MTU if this flag is set (with EMSGSIZE
).
Esto me parece que puede establecer el valor predeterminado de todo el sistema utilizando sysctl
:
sysctl ip_no_pmtu_disc
vuelve "error: "ip_no_pmtu_disc" is an unknown key"
en mi sistema, pero puede configurarse en el suyo. Aparte de eso, no tengo conocimiento de nada más (aparte de setsockopt()
como se mencionó anteriormente) que puede afectar la configuración.
¿Qué nivel es el debajo, IPPROTO_IP? – WilliamKF
¿Hay alguna otra manera de que esto se establezca? Supongo que, por defecto, el DF está apagado, ¿verdad? – WilliamKF
Creo que está desactivado por defecto, pero puede usar un getsockopt (sorprendentemente :-) para obtener su valor actual. – paxdiablo