windows-multihomed-20041209
authorJeffrey Altman <jaltman@mit.edu>
Thu, 9 Dec 2004 23:14:01 +0000 (23:14 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 9 Dec 2004 23:14:01 +0000 (23:14 +0000)
FIXES 16564

Add support for VL_GetEntryByNameU and VL_GetAddrs for the purpose
of working with multi-homed servers

doc/txt/winnotes/afs-changes-since-1.2.txt
src/WINNT/afsd/cm_server.h
src/WINNT/afsd/cm_volume.c
src/config/NTMakefile.i386_nt40

index 4facd2f..ed900c6 100644 (file)
@@ -1,3 +1,7 @@
+Since 1.3.75:
+
+  * Support has been added for multi-homed servers
+
 Since 1.3.74:
   * Added a new registry value, "StoreAnsiFilenames", which can be used
     to force the use of ANSI character sets instead of OEM Code Pages.
index 0ea6e67..3483507 100644 (file)
  * at the appropriate times to change the pointers to these servers.
  */
 typedef struct cm_server {
-       struct cm_server *allNextp;             /* locked by cm_serverLock */
+    struct cm_server *allNextp;                /* locked by cm_serverLock */
     struct sockaddr_in addr;           /* by mx */
     int type;                          /* by mx */
-       struct cm_conn *connsp;                 /* locked by cm_connLock */
+    struct cm_conn *connsp;            /* locked by cm_connLock */
     long flags;                                /* by mx */
-    struct cm_cell *cellp;                     /* cell containing this server */
-       unsigned long refCount;                         /* locked by cm_serverLock */
-    osi_mutex_t mx;
-       unsigned short ipRank;                  /* server priority */
+    struct cm_cell *cellp;             /* cell containing this server */
+    unsigned long refCount;            /* locked by cm_serverLock */
+    osi_mutex_t mx;                     
+    unsigned short ipRank;             /* server priority */
 } cm_server_t;
 
 enum repstate {not_busy, busy, offline};
index 932b9b8..f8ab011 100644 (file)
@@ -63,11 +63,12 @@ void cm_InitVolume(void)
  *    first, and fall back to successively older versions if you get
  *    RXGEN_OPCODE.
  */
+#define MULTIHOMED 1
 long cm_UpdateVolume(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp,
        cm_volume_t *volp)
 {
     cm_conn_t *connp;
-    int i;
+    int i, j, k;
     cm_serverRef_t *tsrp;
     cm_server_t *tsp;
     struct sockaddr_in tsockAddr;
@@ -95,6 +96,7 @@ long cm_UpdateVolume(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp,
         osi_Log1(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s", volp->namep);
 #ifdef MULTIHOMED
         code = VL_GetEntryByNameU(connp->callp, volp->namep, &uvldbEntry);
+               type = 2;
         if ( code == RXGEN_OPCODE ) 
 #endif
         {
@@ -147,17 +149,47 @@ long cm_UpdateVolume(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp,
             rwID = uvldbEntry.volumeId[0];
             roID = uvldbEntry.volumeId[1];
             bkID = uvldbEntry.volumeId[2];
-            for ( i=0; i<nServers; i++ ) {
-                serverFlags[i] = uvldbEntry.serverFlags[i];
-                if ( !(flags & VLSERVER_FLAG_UUID) )
-                    serverNumber[i] = uvldbEntry.serverNumber[i].time_low;
-                else {
-                    /* see afs/afs_volume.c InstallUVolumeEntry().  We need to 
-                     * implement an equivalent to afs_FindServer() and afs_GetServer()
-                     * which support multiple addresses.
-                     */
+            for ( i=0, j=0; i<nServers && j<NMAXNSERVERS; i++ ) {
+                if ( !(uvldbEntry.serverFlags[i] & VLSERVER_FLAG_UUID) ) {
+                    serverFlags[j] = uvldbEntry.serverFlags[i];
+                    serverNumber[j] = uvldbEntry.serverNumber[i].time_low;
+                                       j++;
+                } else {
+                    afs_uint32 * addrp, nentries, code, unique;
+                    bulkaddrs  addrs;
+                    ListAddrByAttributes attrs;
+                    afsUUID uuid;
+
+                    memset((char *)&attrs, 0, sizeof(attrs));
+                    attrs.Mask = VLADDR_UUID;
+                    attrs.uuid = uvldbEntry.serverNumber[i];
+                    memset((char *)&uuid, 0, sizeof(uuid));
+                    memset((char *)&addrs, 0, sizeof(addrs));
+
+                    do {
+                        code = cm_ConnByMServers(cellp->vlServersp, userp, reqp, &connp);
+                        if (code) 
+                            continue;
+                   
+                        code = VL_GetAddrsU(connp->callp, &attrs, &uuid, &unique, &nentries, &addrs);
+
+                        if (code == 0 && nentries == 0)
+                            code = VL_NOENT;
+                    } while (cm_Analyze(connp, userp, reqp, NULL, NULL, cellp->vlServersp, NULL, code));
+                    code = cm_MapVLRPCError(code, reqp);
+                    if (code)
+                        return code;
+
+                    addrp = addrs.bulkaddrs_val;
+                    for (k = 0; k < nentries && j < NMAXNSERVERS; j++, k++) {
+                        serverFlags[j] = uvldbEntry.serverFlags[i];
+                        serverNumber[j] = addrp[k];
+                    }
+
+                    free(addrs.bulkaddrs_val);  /* This is wrong */
                 }
             }
+                       nServers = j;                                   /* update the server count */
             break;
 #endif
         }
index 366683f..85c3b0a 100644 (file)
@@ -80,7 +80,7 @@ LIB = $(AFSDEV_LIB)
 #define used in WinNT/2000 installation and program version display
 AFSPRODUCT_VER_MAJOR=1
 AFSPRODUCT_VER_MINOR=3
-AFSPRODUCT_VER_PATCH=7500
+AFSPRODUCT_VER_PATCH=7501
 AFSPRODUCT_VER_BUILD=0
 
 # For MSI installer, each major release should have a different GUID