]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
linux-compute-mtu-correctly-20011005
authorNickolai Zeldovich <kolya@mit.edu>
Fri, 5 Oct 2001 21:38:57 +0000 (21:38 +0000)
committerDerrick Brashear <shadow@dementia.org>
Fri, 5 Oct 2001 21:38:57 +0000 (21:38 +0000)
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
src/afsd/afsd.c
src/rx/rx_getaddr.c

index 71cea688b038952f745a1472f96b5e053c5c529e..9f0dd0c00aaaf5b4e1dbe08c31bb354393a8ed8c 100644 (file)
@@ -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];
index 7ff32b8e84eb6cb36baeb62b983fe49cc68ac603..efacd09838108c28e4d5bcf194c039c5ae4738ad 100644 (file)
@@ -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);
index 6c19b3e42af834965d35fa61dfca29137d4e6512..4bef1ec2a15e6d0aac21878c7ba9f5d34fb9f15f 100644 (file)
@@ -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 */