From 34a3a269ec44a5c62b8d6241613bf9fde8404577 Mon Sep 17 00:00:00 2001 From: Nickolai Zeldovich Date: Fri, 5 Oct 2001 21:38:57 +0000 Subject: [PATCH] linux-compute-mtu-correctly-20011005 This patch fixes two bugs: (1) pass more than 4 parameters to AFSCALL syscalls on Linux, allowing the ADVISEADDR op to pass the MTU array pointer. (2) properly convert MTU's to network byte order, since that's what the rest of the code expects them to be. --- src/afs/afs_call.c | 3 ++- src/afsd/afsd.c | 10 ++++++++++ src/rx/rx_getaddr.c | 8 ++++---- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/afs/afs_call.c b/src/afs/afs_call.c index 71cea68..9f0dd0c 100644 --- a/src/afs/afs_call.c +++ b/src/afs/afs_call.c @@ -943,6 +943,7 @@ asmlinkage int afs_syscall(long syscall, long parm1, long parm2, long parm3, long linux_ret=0; long *retval = &linux_ret; long eparm[4]; /* matches AFSCALL_ICL in fstrace.c */ + /* eparm is also used by AFSCALL_CALL in afsd.c */ #else #if defined(UKERNEL) Afs_syscall () @@ -1003,7 +1004,7 @@ Afs_syscall () uap->parm1 = parm1; uap->parm2 = parm2; uap->parm3 = parm3; - if (syscall == AFSCALL_ICL) { + if (syscall == AFSCALL_ICL || syscall == AFSCALL_CALL) { AFS_COPYIN((char*)parm4, (char*)eparm, sizeof(eparm), code); uap->parm4 = eparm[0]; uap->parm5 = eparm[1]; diff --git a/src/afsd/afsd.c b/src/afsd/afsd.c index 7ff32b8..efacd09 100644 --- a/src/afsd/afsd.c +++ b/src/afsd/afsd.c @@ -1956,6 +1956,16 @@ call_syscall(param1, param2, param3, param4, param5, param6, param7) long param1, param2, param3, param4, param5, param6, param7; { int error; +#ifdef AFS_LINUX20_ENV + long eparm[4]; + + eparm[0] = param4; + eparm[1] = param5; + eparm[2] = param6; + eparm[3] = param7; + + param4 = eparm; +#endif error = syscall(AFS_SYSCALL, AFSCALL_CALL, param1, param2, param3, param4, param5, param6, param7); if (afsd_verbose) printf("SScall(%d, %d)=%d ", AFS_SYSCALL, AFSCALL_CALL, error); diff --git a/src/rx/rx_getaddr.c b/src/rx/rx_getaddr.c index 6c19b3e..4bef1ec 100644 --- a/src/rx/rx_getaddr.c +++ b/src/rx/rx_getaddr.c @@ -303,9 +303,9 @@ int rxi_getAllAddrMaskMtu (addrBuffer, maskBuffer, mtuBuffer, maxSize) ifr.ifr_addr.sa_family=AF_INET; strncpy(ifr.ifr_name, sdl->sdl_data, sdl->sdl_nlen); if (ioctl(s, SIOCGIFMTU, (caddr_t)&ifr) < 0) - mtuBuffer[count]=1500; + mtuBuffer[count]=htonl(1500); else - mtuBuffer[count]=ifr.ifr_mtu; + mtuBuffer[count]=htonl(ifr.ifr_mtu); count++; } addrcount--; @@ -464,14 +464,14 @@ int rxi_getAllAddrMaskMtu (addrBuffer, maskBuffer, mtuBuffer, maxSize) if ( ioctl(s, SIOCGIFMTU, (caddr_t)ifr) < 0) { perror("SIOCGIFMTU"); } else { - mtuBuffer[count] = ifr->ifr_metric; + mtuBuffer[count] = htonl(ifr->ifr_metric); } #endif /* SIOCGIFMTU */ #ifdef SIOCRIPMTU if ( ioctl(s, SIOCRIPMTU, (caddr_t)ifr) < 0) { perror("SIOCRIPMTU"); } else { - mtuBuffer[count] = ifr->ifr_metric; + mtuBuffer[count] = htonl(ifr->ifr_metric); } #endif /* SIOCRIPMTU */ -- 1.9.4