summaryrefslogtreecommitdiffstats
path: root/sys/net/if_stf.c
diff options
context:
space:
mode:
authormelifaro <melifaro@FreeBSD.org>2012-07-15 17:44:27 +0000
committermelifaro <melifaro@FreeBSD.org>2012-07-15 17:44:27 +0000
commit497943ec39eb8fe771d00ff04ef65db4e90d5616 (patch)
tree781856269d5a94b712ccda1d7b88eb2bed9208f3 /sys/net/if_stf.c
parent275e546b68cd64ff7e71e02681d38cff5321de8d (diff)
downloadFreeBSD-src-497943ec39eb8fe771d00ff04ef65db4e90d5616.zip
FreeBSD-src-497943ec39eb8fe771d00ff04ef65db4e90d5616.tar.gz
Permit changing MTU in 6to4 relay.
This behavior is recommended by RFC 4213 clause 3.2. Sometimes fragmentation is the least evil. For example, some Linux IPVS kernels forwards ICMPv6 checksums to real servers incorrectly. Reviewed by: hrs(previous version) Approved by: kib(mentor) MFC after: 1 week
Diffstat (limited to 'sys/net/if_stf.c')
-rw-r--r--sys/net/if_stf.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/sys/net/if_stf.c b/sys/net/if_stf.c
index fa8ee64..fc8c6fa 100644
--- a/sys/net/if_stf.c
+++ b/sys/net/if_stf.c
@@ -793,7 +793,7 @@ stf_rtrequest(cmd, rt, info)
struct rt_addrinfo *info;
{
RT_LOCK_ASSERT(rt);
- rt->rt_rmx.rmx_mtu = IPV6_MMTU;
+ rt->rt_rmx.rmx_mtu = rt->rt_ifp->if_mtu;
}
static int
@@ -806,7 +806,7 @@ stf_ioctl(ifp, cmd, data)
struct ifreq *ifr;
struct sockaddr_in6 *sin6;
struct in_addr addr;
- int error;
+ int error, mtu;
error = 0;
switch (cmd) {
@@ -840,6 +840,18 @@ stf_ioctl(ifp, cmd, data)
error = EAFNOSUPPORT;
break;
+ case SIOCGIFMTU:
+ break;
+
+ case SIOCSIFMTU:
+ ifr = (struct ifreq *)data;
+ mtu = ifr->ifr_mtu;
+ /* RFC 4213 3.2 ideal world MTU */
+ if (mtu < IPV6_MINMTU || mtu > IF_MAXMTU - 20)
+ return (EINVAL);
+ ifp->if_mtu = mtu;
+ break;
+
default:
error = EINVAL;
break;
OpenPOWER on IntegriCloud