--- 9.9.11rc1 released ---
+4435. [tuning] Only set IPV6_USE_MIN_MTU for UDP when the message
+ will not fit into a single IPv4 encapsulated IPv6
+ UDP packet when transmitted over a Ethernet link.
+ [RT #42871]
+
4647. [bug] Change 4643 broke verification of TSIG signed TCP
message sequences where not all the messages contain
TSIG records. These may be used in AXFR and IXFR
isc_buffer_usedregion(buffer, &r);
+ /*
+ * If this is a UDP client and the IPv6 packet can't be
+ * encapsulated without generating a PTB on a 1500 octet
+ * MTU link force fragmentation at 1280 if it is a IPv6
+ * response.
+ */
+ if (!TCP_CLIENT(client) && r.length > 1432)
+ client->sendevent->attributes |= ISC_SOCKEVENTATTR_USEMINMTU;
+
CTRACE("sendto");
result = isc_socket_sendto2(sock, &r, client->task,
* _TIMESTAMP: The timestamp member is valid.
* _PKTINFO: The pktinfo member is valid.
* _MULTICAST: The UDP packet was received via a multicast transmission.
+ * _USEMINMTU: Set the per packet IPV6_USE_MIN_MTU flag.
*/
#define ISC_SOCKEVENTATTR_ATTACHED 0x80000000U /* internal */
#define ISC_SOCKEVENTATTR_TRUNC 0x00800000U /* public */
#define ISC_SOCKEVENTATTR_TIMESTAMP 0x00200000U /* public */
#define ISC_SOCKEVENTATTR_PKTINFO 0x00100000U /* public */
#define ISC_SOCKEVENTATTR_MULTICAST 0x00080000U /* public */
+#define ISC_SOCKEVENTATTR_USEMINMTU 0x00020000U /* public */
/*@}*/
#define ISC_SOCKEVENT_ANYEVENT (0)
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id$ */
-
/*! \file */
#include <config.h>
isc_region_t used;
size_t write_count;
size_t skip_count;
+#ifdef ISC_NET_BSD44MSGHDR
+ struct cmsghdr *cmsgp;
+#endif
memset(msg, 0, sizeof(*msg));
msg->msg_control = NULL;
msg->msg_controllen = 0;
msg->msg_flags = 0;
-#if defined(USE_CMSG) && defined(ISC_PLATFORM_HAVEIN6PKTINFO)
- if ((sock->type == isc_sockettype_udp)
- && ((dev->attributes & ISC_SOCKEVENTATTR_PKTINFO) != 0)) {
-#if defined(IPV6_USE_MIN_MTU)
- int use_min_mtu = 1; /* -1, 0, 1 */
-#endif
- struct cmsghdr *cmsgp;
+#if defined(USE_CMSG)
+
+#if defined(ISC_PLATFORM_HAVEIN6PKTINFO)
+ if ((sock->type == isc_sockettype_udp) &&
+ ((dev->attributes & ISC_SOCKEVENTATTR_PKTINFO) != 0))
+ {
struct in6_pktinfo *pktinfop;
socket_log(sock, NULL, TRACE,
cmsgp->cmsg_len = cmsg_len(sizeof(struct in6_pktinfo));
pktinfop = (struct in6_pktinfo *)CMSG_DATA(cmsgp);
memmove(pktinfop, &dev->pktinfo, sizeof(struct in6_pktinfo));
+ }
+#endif
+
#if defined(IPV6_USE_MIN_MTU)
- /*
- * Set IPV6_USE_MIN_MTU as a per packet option as FreeBSD
- * ignores setsockopt(IPV6_USE_MIN_MTU) when IPV6_PKTINFO
- * is used.
- */
+ if ((sock->type == isc_sockettype_udp) &&
+ ((dev->attributes & ISC_SOCKEVENTATTR_USEMINMTU) != 0))
+ {
+ int use_min_mtu = 1; /* -1, 0, 1 */
+
cmsgp = (struct cmsghdr *)(sock->sendcmsgbuf +
msg->msg_controllen);
msg->msg_controllen += cmsg_space(sizeof(use_min_mtu));
cmsgp->cmsg_type = IPV6_USE_MIN_MTU;
cmsgp->cmsg_len = cmsg_len(sizeof(use_min_mtu));
memmove(CMSG_DATA(cmsgp), &use_min_mtu, sizeof(use_min_mtu));
-#endif
}
-#endif /* USE_CMSG && ISC_PLATFORM_HAVEIPV6 */
+#endif
+
+#endif /* USE_CMSG */
#else /* ISC_NET_BSD44MSGHDR */
msg->msg_accrights = NULL;
msg->msg_accrightslen = 0;
/*
* Use minimum mtu if possible.
*/
- use_min_mtu(sock);
if (sock->type == isc_sockettype_tcp && sock->pf == AF_INET6) {
+ use_min_mtu(sock);
set_tcp_maxseg(sock, 1280 - 20 - 40); /* 1280 - TCP - IPV6 */
}