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 71cea68..9f0dd0c 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 7ff32b8..efacd09 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 6c19b3e..4bef1ec 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 */