[ac_cv_setsockopt_iprecverr=no])])
AS_IF([test "$ac_cv_setsockopt_iprecverr" = "yes"],
- [AC_DEFINE(ADAPT_PMTU_RECVERR, 1,
- [define if asynchronous socket errors can be received])])
+ [AC_DEFINE([HAVE_SETSOCKOPT_IP_RECVERR], [1],
+ [define if we can receive socket errors via IP_RECVERR])])
PTHREAD_LIBS=error
if test "x$MKAFS_OSTYPE" = OBSD; then
fi
AC_SUBST(USE_UNIX_SOCKETS)
-dnl if test "$ac_cv_setsockopt_iprecverr" = "yes"; then
-dnl AC_DEFINE(ADAPT_PMTU, 1, [define if you want to decode icmp unreachable packets to discover path mtu])
-dnl fi
-
if test "$enable_namei_fileserver" = "yes"; then
AC_DEFINE(AFS_NAMEI_ENV, 1, [define if you want to want namei fileserver])
VFSCK=""
#include <features.h>
#endif
+#ifdef notyet
+#if defined(HAVE_LINUX_ERRQUEUE_H) && defined(HAVE_SETSOCKOPT_IP_RECVERR)
+# define AFS_RXERRQ_ENV
+#endif
+#ifdef AFS_RXERRQ_ENV
+# define AFS_ADAPT_PMTU
+#endif
+#endif
+
#ifdef __GLIBC__
#if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 3)
#define USE_UCONTEXT
#include <linux/version.h>
#include "rx/rx_kcommon.h"
+#include "rx.h"
+#include "rx_atomic.h"
+#include "rx_globals.h"
+#include "rx_stats.h"
+#include "rx_peer.h"
+#include "rx_packet.h"
+#include "rx_internal.h"
#include <asm/uaccess.h>
-#ifdef ADAPT_PMTU
+#ifdef AFS_RXERRQ_ENV
#include <linux/errqueue.h>
#include <linux/icmp.h>
#endif
struct socket *sockp;
struct sockaddr_in myaddr;
int code;
-#ifdef ADAPT_PMTU
+#ifdef AFS_ADAPT_PMTU
int pmtu = IP_PMTUDISC_WANT;
- int do_recverr = 1;
#else
int pmtu = IP_PMTUDISC_DONT;
#endif
kernel_setsockopt(sockp, SOL_IP, IP_MTU_DISCOVER, (char *)&pmtu,
sizeof(pmtu));
-#ifdef ADAPT_PMTU
- kernel_setsockopt(sockp, SOL_IP, IP_RECVERR, (char *)&do_recverr,
- sizeof(do_recverr));
+#ifdef AFS_RXERRQ_ENV
+ {
+ int recverr = 1;
+ kernel_setsockopt(sockp, SOL_IP, IP_RECVERR, (char *)&recverr,
+ sizeof(recverr));
+ }
#endif
return (osi_socket *)sockp;
}
return 0;
}
-#ifdef ADAPT_PMTU
+#ifdef AFS_RXERRQ_ENV
void
handle_socket_error(osi_socket so)
{
memcpy(&addr, offender, sizeof(addr));
+# ifdef AFS_ADAPT_PMTU
if (err->ee_origin == SO_EE_ORIGIN_ICMP &&
err->ee_type == ICMP_DEST_UNREACH &&
err->ee_code == ICMP_FRAG_NEEDED) {
rxi_SetPeerMtu(NULL, ntohl(addr.sin_addr.s_addr), ntohs(addr.sin_port),
err->ee_info);
}
+# endif
/* other DEST_UNREACH's and TIME_EXCEEDED should be dealt with too */
out:
{
struct msghdr msg;
int code;
-#ifdef ADAPT_PMTU
+#ifdef AFS_RXERRQ_ENV
int sockerr;
int esize;
{
struct msghdr msg;
int code;
-#ifdef ADAPT_PMTU
+#ifdef AFS_RXERRQ_ENV
int sockerr;
int esize;
#endif
if (iovcnt > RX_MAXWVECS + 2) {
osi_Panic("Too many (%d) iovecs passed to osi_NetReceive\n", iovcnt);
}
-#ifdef ADAPT_PMTU
+#ifdef AFS_RXERRQ_ENV
while (1) {
sockerr=0;
esize = sizeof(sockerr);
* number of seconds. */
if (now > (call->lastReceiveTime + deadTime)) {
if (call->state == RX_STATE_ACTIVE) {
-#ifdef ADAPT_PMTU
+#ifdef AFS_ADAPT_PMTU
# if defined(KERNEL) && defined(AFS_SUN5_ENV)
ire_t *ire;
# if defined(AFS_SUN510_ENV) && defined(GLOBAL_NETSTACKID)
netstack_rele(ns);
# endif
# endif
-#endif /* ADAPT_PMTU */
+#endif /* AFS_ADAPT_PMTU */
cerror = RX_CALL_DEAD;
goto mtuout;
} else {
int
rxi_Recvmsg(osi_socket socket, struct msghdr *msg_p, int flags)
{
-#if defined(HAVE_LINUX_ERRQUEUE_H) && defined(ADAPT_PMTU)
+#ifdef AFS_RXERRQ_ENV
while((rxi_HandleSocketError(socket)) > 0)
;
#endif
}
FD_SET(socket, sfds);
}
-#if defined(HAVE_LINUX_ERRQUEUE_H) && defined(ADAPT_PMTU)
+#ifdef AFS_RXERRQ_ENV
while((rxi_HandleSocketError(socket)) > 0)
;
#endif
rxi_Recvmsg(osi_socket socket, struct msghdr *msg_p, int flags)
{
int ret;
-#if defined(HAVE_LINUX_ERRQUEUE_H) && defined(ADAPT_PMTU)
+#ifdef AFS_RXERRQ_ENV
while((rxi_HandleSocketError(socket)) > 0)
;
#endif
#define IPPORT_USERRESERVED 5000
# endif
-#if defined(HAVE_LINUX_ERRQUEUE_H) && defined(ADAPT_PMTU)
+#if defined(AFS_LINUX22_ENV) && defined(AFS_RXERRQ_ENV)
# include <linux/types.h>
# include <linux/errqueue.h>
-# ifndef IP_MTU
+# if defined(AFS_ADAPT_PMTU) && !defined(IP_MTU)
# define IP_MTU 14
# endif
#endif
#include "rx_stats.h"
#include "rx_peer.h"
#include "rx_packet.h"
+#include "rx_internal.h"
#ifdef AFS_PTHREAD_ENV
struct sockaddr_in taddr;
char *name = "rxi_GetUDPSocket: ";
#ifdef AFS_LINUX22_ENV
-# if defined(ADAPT_PMTU)
+# if defined(AFS_ADAPT_PMTU)
int pmtu = IP_PMTUDISC_WANT;
- int recverr = 1;
# else
int pmtu = IP_PMTUDISC_DONT;
# endif
#ifdef AFS_LINUX22_ENV
setsockopt(socketFd, SOL_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
-#if defined(ADAPT_PMTU)
- setsockopt(socketFd, SOL_IP, IP_RECVERR, &recverr, sizeof(recverr));
#endif
+#ifdef AFS_RXERRQ_ENV
+ {
+ int recverr = 1;
+ setsockopt(socketFd, SOL_IP, IP_RECVERR, &recverr, sizeof(recverr));
+ }
#endif
if (rxi_Listen(socketFd) < 0) {
goto error;
afs_uint32 ppaddr;
u_short rxmtu;
int ix;
-#if defined(ADAPT_PMTU) && defined(IP_MTU)
+#ifdef AFS_ADAPT_PMTU
int sock;
struct sockaddr_in addr;
#endif
rx_rto_setPeerTimeoutSecs(pp, 3);
pp->ifMTU = MIN(rx_MyMaxSendSize, RX_REMOTE_PACKET_SIZE);
}
-#if defined(ADAPT_PMTU) && defined(IP_MTU)
+#ifdef AFS_ADAPT_PMTU
sock=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock != OSI_NULLSOCKET) {
addr.sin_family = AF_INET;
return 0;
}
-#if defined(ADAPT_PMTU)
+#ifdef AFS_RXERRQ_ENV
int
rxi_HandleSocketError(int socket)
{
- int ret=0;
-#if defined(HAVE_LINUX_ERRQUEUE_H)
+ int ret = 0;
struct msghdr msg;
struct cmsghdr *cmsg;
struct sock_extended_err *err;
ret = 1;
err = (struct sock_extended_err *) CMSG_DATA(cmsg);
+# ifdef AFS_ADAPT_PMTU
if (err->ee_errno == EMSGSIZE && err->ee_info >= 68) {
rxi_SetPeerMtu(NULL, addr.sin_addr.s_addr, addr.sin_port,
err->ee_info - RX_IPUDP_SIZE);
}
+# endif
/* other DEST_UNREACH's and TIME_EXCEEDED should be dealt with too */
out:
-#endif
return ret;
}
#endif