--- /usr/src/sys/sys/socket.h.orig Thu May 4 12:56:39 2006 +++ /usr/src/sys/sys/socket.h Fri May 5 00:14:41 2006 @@ -118,6 +118,7 @@ #define SO_ACCEPTFILTER 0x1000 /* there is an accept filter */ #define SO_BINTIME 0x2000 /* timestamp received dgram traffic */ #endif +#define SO_DONTFRAGMENT 0x4000 /* don't fragment packet */ /* * Additional options, not kept in so_options. --- /usr/src/sys/kern/uipc_socket.c.orig Thu May 4 13:00:50 2006 +++ /usr/src/sys/kern/uipc_socket.c Fri May 5 00:11:39 2006 @@ -1553,6 +1553,7 @@ #ifdef MAC struct mac extmac; #endif + struct inpcb *inp = sotoinpcb(so); error = 0; if (sopt->sopt_level != SOL_SOCKET) { @@ -1594,6 +1595,7 @@ case SO_TIMESTAMP: case SO_BINTIME: case SO_NOSIGPIPE: + case SO_DONTFRAGMENT: error = sooptcopyin(sopt, &optval, sizeof optval, sizeof optval); if (error) @@ -1603,6 +1605,23 @@ so->so_options |= sopt->sopt_name; else so->so_options &= ~sopt->sopt_name; + + switch (sopt->sopt_name) { + +#define OPTSET(bit) do { \ + INP_LOCK(inp); \ + if (optval) \ + inp->inp_flags |= bit; \ + else \ + inp->inp_flags &= ~bit; \ + INP_UNLOCK(inp); \ +} while (0) + + case SO_DONTFRAGMENT: + OPTSET(INP_DONTFRAG); + break; + } + SOCK_UNLOCK(so); break;