From: Nickolai Zeldovich Date: Fri, 5 Oct 2001 21:38:57 +0000 (+0000) Subject: linux-compute-mtu-correctly-20011005 X-Git-Tag: openafs-devel-1_3_0~263 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=34a3a269ec44a5c62b8d6241613bf9fde8404577;p=packages%2Fo%2Fopenafs.git 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. --- diff --git a/src/afs/afs_call.c b/src/afs/afs_call.c index 71cea688b..9f0dd0c00 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 7ff32b8e8..efacd0983 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 6c19b3e42..4bef1ec2a 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 */