From: Derrick Brashear Date: Tue, 13 Jun 2006 01:28:48 +0000 (+0000) Subject: rxbind-for-servers-20060612 X-Git-Tag: BP-openafs-windows-kdfs-ifs~1270 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=592d97f9472abcf77496cef07261fa8766f60b9f rxbind-for-servers-20060612 FIXES 32308 support -rxbind switch for servers --- diff --git a/src/bozo/bosserver.c b/src/bozo/bosserver.c index 2351eeb..b82c1a6 100644 --- a/src/bozo/bosserver.c +++ b/src/bozo/bosserver.c @@ -71,6 +71,11 @@ static afs_int32 nextDay; struct ktime bozo_nextRestartKT, bozo_nextDayKT; int bozo_newKTs; +int rxBind = 0; + +#define ADDRSPERSITE 16 /* Same global is in rx/rx_user.c */ +afs_uint32 SHostAddrs[ADDRSPERSITE]; + #ifdef BOS_RESTRICTED_MODE int bozo_isrestricted = 0; int bozo_restdisable = 0; @@ -719,6 +724,7 @@ main(int argc, char **argv, char **envp) int i; char namebuf[AFSDIR_PATH_MAX]; int rxMaxMTU = -1; + afs_uint32 host = htonl(INADDR_ANY); #ifndef AFS_NT40_ENV int nofork = 0; struct stat sb; @@ -813,6 +819,9 @@ main(int argc, char **argv, char **envp) bozo_isrestricted = 1; } #endif + else if (strcmp(argv[code], "-rxbind") == 0) { + rxBind = 1; + } else if (!strcmp(argv[i], "-rxmaxmtu")) { if ((i + 1) >= argc) { fprintf(stderr, "missing argument for -rxmaxmtu\n"); @@ -864,14 +873,14 @@ main(int argc, char **argv, char **envp) #ifndef AFS_NT40_ENV printf("Usage: bosserver [-noauth] [-log] " "[-auditlog ] " - "[-rxmaxmtu ] " + "[-rxmaxmtu ] [-rxbind] " "[-syslog[=FACILITY]] " "[-enable_peer_stats] [-enable_process_stats] " "[-nofork] " "[-help]\n"); #else printf("Usage: bosserver [-noauth] [-log] " "[-auditlog ] " - "[-rxmaxmtu ] " + "[-rxmaxmtu ] [-rxbind] " "[-enable_peer_stats] [-enable_process_stats] " "[-help]\n"); #endif @@ -1028,7 +1037,23 @@ main(int argc, char **argv, char **envp) rx_SetMaxMTU(rxMaxMTU); } - tservice = rx_NewService( /* port */ 0, /* service id */ 1, + if (rxBind) { + afs_int32 ccode; + if (AFSDIR_SERVER_NETRESTRICT_FILEPATH || + AFSDIR_SERVER_NETINFO_FILEPATH) { + char reason[1024]; + ccode = parseNetFiles(SHostAddrs, NULL, NULL, + ADDRSPERSITE, reason, + AFSDIR_SERVER_NETINFO_FILEPATH, + AFSDIR_SERVER_NETRESTRICT_FILEPATH); + } else { + ccode = rx_getAllAddr(SHostAddrs, ADDRSPERSITE); + } + if (ccode == 1) + host = SHostAddrs[0]; + } + + tservice = rx_NewServiceHost(host, /* port */ 0, /* service id */ 1, /*service name */ "bozo", /* security classes */ bozo_rxsc, @@ -1038,8 +1063,8 @@ main(int argc, char **argv, char **envp) rx_SetStackSize(tservice, BOZO_LWP_STACKSIZE); /* so gethostbyname works (in cell stuff) */ tservice = - rx_NewService(0, RX_STATS_SERVICE_ID, "rpcstats", bozo_rxsc, 3, - RXSTATS_ExecuteRequest); + rx_NewServiceHost(host, 0, RX_STATS_SERVICE_ID, "rpcstats", bozo_rxsc, + 3, RXSTATS_ExecuteRequest); rx_SetMinProcs(tservice, 2); rx_SetMaxProcs(tservice, 4); rx_StartServer(1); /* donate this process */ diff --git a/src/budb/server.c b/src/budb/server.c index 3f0ebc9..ed7749e 100644 --- a/src/budb/server.c +++ b/src/budb/server.c @@ -76,6 +76,11 @@ char dbDir[AFSDIR_PATH_MAX], cellConfDir[AFSDIR_PATH_MAX]; /* debugging control */ int debugging = 0; +int rxBind = 0; + +#define ADDRSPERSITE 16 /* Same global is in rx/rx_user.c */ +afs_uint32 SHostAddrs[ADDRSPERSITE]; + #if defined(AFS_PTHREAD_ENV) char * threadNum(void) @@ -357,11 +362,10 @@ main(argc, argv) struct afsconf_cell cellinfo; time_t currentTime; afs_int32 code = 0; + afs_uint32 host = ntohl(INADDR_ANY); char clones[MAXHOSTSPERCELL]; - - struct rx_service *tservice; struct rx_securityClass *sca[3]; @@ -517,6 +521,24 @@ main(argc, argv) rx_SetRxDeadTime(60); /* 60 seconds inactive before timeout */ + if (rxBind) { + afs_int32 ccode; + if (AFSDIR_SERVER_NETRESTRICT_FILEPATH || + AFSDIR_SERVER_NETINFO_FILEPATH) { + char reason[1024]; + ccode = parseNetFiles(SHostAddrs, NULL, NULL, + ADDRSPERSITE, reason, + AFSDIR_SERVER_NETINFO_FILEPATH, + AFSDIR_SERVER_NETRESTRICT_FILEPATH); + } else { + ccode = rx_getAllAddr(SHostAddrs, ADDRSPERSITE); + } + if (ccode == 1) { + host = SHostAddrs[0]; + rx_InitHost(host, htons(AFSCONF_BUDBPORT)); + } + } + code = ubik_ServerInitByInfo (globalConfPtr->myHost, htons(AFSCONF_BUDBPORT), &cellinfo, @@ -540,7 +562,7 @@ main(argc, argv) rx_SetNoJumbo(); tservice = - rx_NewService(0, BUDB_SERVICE, "BackupDatabase", sca, 3, + rx_NewServiceHost(host, 0, BUDB_SERVICE, "BackupDatabase", sca, 3, BUDB_ExecuteRequest); if (tservice == (struct rx_service *)0) { LogError(0, "Could not create backup database rx service\n"); diff --git a/src/butc/tcmain.c b/src/butc/tcmain.c index 787fa8d..20229d7 100644 --- a/src/butc/tcmain.c +++ b/src/butc/tcmain.c @@ -106,6 +106,10 @@ afs_int32 statusSize; afs_int32 BufferSize; /* Size in B stored for data */ char *centralLogFile; afs_int32 lastLog; /* Log last pass info */ +int rxBind = 0; + +#define ADDRSPERSITE 16 /* Same global is in rx/rx_user.c */ +afs_uint32 SHostAddrs[ADDRSPERSITE]; /* dummy routine for the audit work. It should do nothing since audits */ /* occur at the server level and bos is not a server. */ @@ -857,6 +861,7 @@ WorkerBee(as, arock) PROCESS dbWatcherPid; #endif time_t t; + afs_uint32 host = htonl(INADDR_ANY); debugLevel = 0; @@ -1039,8 +1044,25 @@ WorkerBee(as, arock) autoQuery = 0; localauth = (as->parms[5].items ? 1 : 0); + rxBind = (as->parms[8].items ? 1 : 0); + + if (rxBind) { + afs_int32 ccode; + if (AFSDIR_SERVER_NETRESTRICT_FILEPATH || + AFSDIR_SERVER_NETINFO_FILEPATH) { + char reason[1024]; + ccode = parseNetFiles(SHostAddrs, NULL, NULL, + ADDRSPERSITE, reason, + AFSDIR_SERVER_NETINFO_FILEPATH, + AFSDIR_SERVER_NETRESTRICT_FILEPATH); + } else { + ccode = rx_getAllAddr(SHostAddrs, ADDRSPERSITE); + } + if (ccode == 1) + host = SHostAddrs[0]; + } - code = rx_Init(htons(BC_TAPEPORT + portOffset)); + code = rx_InitHost(host, htons(BC_TAPEPORT + portOffset)); if (code) { TapeLog(0, 0, code, 0, "rx init failed on port %u\n", BC_TAPEPORT + portOffset); @@ -1080,7 +1102,7 @@ WorkerBee(as, arock) } service = - rx_NewService(0, 1, "BUTC", securityObjects, 3, TC_ExecuteRequest); + rx_NewServiceHost, (host, 0, 1, "BUTC", securityObjects, 3, TC_ExecuteRequest); if (!service) { TLog(0, "rx_NewService"); exit(1); @@ -1183,6 +1205,8 @@ main(argc, argv) "file to restore to"); cmd_AddParm(ts, "-xbsaforcemultiple", CMD_FLAG, (CMD_OPTIONAL | CMD_HIDE), "Force multiple XBSA server support"); + cmd_AddParm(ts, "-rxbind", CMD_FLAG, CMD_OPTIONAL, + "bind Rx socket"); /* Initialize dirpaths */ if (!(initAFSDirPath() & AFSDIR_SERVER_PATHS_OK)) { diff --git a/src/kauth/kaserver.c b/src/kauth/kaserver.c index c1ea8a5..7921d91 100644 --- a/src/kauth/kaserver.c +++ b/src/kauth/kaserver.c @@ -59,6 +59,10 @@ struct ubik_dbase *KA_dbase; afs_int32 myHost = 0; afs_int32 verbose_track = 1; afs_int32 krb4_cross = 0; +afs_int32 rxBind = 0; + +#define ADDRSPERSITE 16 /* Same global is in rx/rx_user.c */ +afs_uint32 SHostAddrs[ADDRSPERSITE]; struct afsconf_dir *KA_conf; /* for getting cell info */ @@ -168,6 +172,7 @@ main(argc, argv) int level; /* security level for Ubik */ afs_int32 i; char clones[MAXHOSTSPERCELL]; + afs_uint32 host = ntohl(INADDR_ANY); struct rx_service *tservice; struct rx_securityClass *sca[1]; @@ -203,7 +208,7 @@ main(argc, argv) if (argc == 0) { usage: printf("Usage: kaserver [-noAuth] [-fastKeys] [-database ] " - "[-auditlog ] " + "[-auditlog ] [-rxbind] " "[-localfiles ] [-minhours ] [-servers ] " "[-crossrealm]" /*" [-enable_peer_stats] [-enable_process_stats] " */ @@ -305,6 +310,8 @@ main(argc, argv) verbose_track = 0; else if (IsArg("-crossrealm")) krb4_cross = 1; + else if (IsArg("-rxbind")) + rxBind = 1; else if (IsArg("-minhours")) { MinHours = atoi(argv[++a]); } else if (IsArg("-enable_peer_stats")) { @@ -377,6 +384,25 @@ main(argc, argv) ubik_CheckRXSecurityRock = (char *)KA_conf; ubik_nBuffers = 80; + + if (rxBind) { + afs_int32 ccode; + if (AFSDIR_SERVER_NETRESTRICT_FILEPATH || + AFSDIR_SERVER_NETINFO_FILEPATH) { + char reason[1024]; + ccode = parseNetFiles(SHostAddrs, NULL, NULL, + ADDRSPERSITE, reason, + AFSDIR_SERVER_NETINFO_FILEPATH, + AFSDIR_SERVER_NETRESTRICT_FILEPATH); + } else { + ccode = rx_getAllAddr(SHostAddrs, ADDRSPERSITE); + } + if (ccode == 1) { + host = SHostAddrs[0]; + rx_InitHost(host, htons(AFSCONF_KAUTHPORT)); + } + } + if (servers) code = ubik_ServerInit(myHost, htons(AFSCONF_KAUTHPORT), serverList, @@ -397,8 +423,8 @@ main(argc, argv) rx_SetNoJumbo(); tservice = - rx_NewService(0, KA_AUTHENTICATION_SERVICE, "AuthenticationService", - sca, 1, KAA_ExecuteRequest); + rx_NewServiceHost(host, 0, KA_AUTHENTICATION_SERVICE, + "AuthenticationService", sca, 1, KAA_ExecuteRequest); if (tservice == (struct rx_service *)0) { ViceLog(0, ("Could not create Authentication rx service\n")); exit(3); @@ -406,8 +432,9 @@ main(argc, argv) rx_SetMinProcs(tservice, 1); rx_SetMaxProcs(tservice, 1); + tservice = - rx_NewService(0, KA_TICKET_GRANTING_SERVICE, "TicketGrantingService", + rx_NewServiceHost(host, 0, KA_TICKET_GRANTING_SERVICE, "TicketGrantingService", sca, 1, KAT_ExecuteRequest); if (tservice == (struct rx_service *)0) { ViceLog(0, ("Could not create Ticket Granting rx service\n")); @@ -421,7 +448,7 @@ main(argc, argv) scm[RX_SCINDEX_KAD] = rxkad_NewServerSecurityObject(rxkad_crypt, 0, kvno_admin_key, 0); tservice = - rx_NewService(0, KA_MAINTENANCE_SERVICE, "Maintenance", scm, 3, + rx_NewServiceHost(host, 0, KA_MAINTENANCE_SERVICE, "Maintenance", scm, 3, KAM_ExecuteRequest); if (tservice == (struct rx_service *)0) { ViceLog(0, ("Could not create Maintenance rx service\n")); @@ -432,7 +459,7 @@ main(argc, argv) rx_SetStackSize(tservice, 10000); tservice = - rx_NewService(0, RX_STATS_SERVICE_ID, "rpcstats", scm, 3, + rx_NewServiceHost(host, 0, RX_STATS_SERVICE_ID, "rpcstats", scm, 3, RXSTATS_ExecuteRequest); if (tservice == (struct rx_service *)0) { ViceLog(0, ("Could not create rpc stats rx service\n")); diff --git a/src/ptserver/ptserver.c b/src/ptserver/ptserver.c index 7cdfb4b..e472fd5 100644 --- a/src/ptserver/ptserver.c +++ b/src/ptserver/ptserver.c @@ -167,6 +167,10 @@ char *pr_realmName; int restricted = 0; int rxMaxMTU = -1; +int rxBind = 0; + +#define ADDRSPERSITE 16 /* Same global is in rx/rx_user.c */ +afs_uint32 SHostAddrs[ADDRSPERSITE]; static struct afsconf_cell info; @@ -222,6 +226,7 @@ main(int argc, char **argv) int kerberosKeys; /* set if found some keys */ int lwps = 3; char clones[MAXHOSTSPERCELL]; + afs_uint32 host = htonl(INADDR_ANY); const char *pr_dbaseName; char *whoami = "ptserver"; @@ -305,6 +310,9 @@ main(int argc, char **argv) else if (strncmp(arg, "-restricted", alen) == 0) { restricted = 1; } + else if (strncmp(arg, "-rxbind", alen) == 0) { + rxBind = 1; + } else if (strncmp(arg, "-enable_peer_stats", alen) == 0) { rx_enablePeerRPCStats(); } else if (strncmp(arg, "-enable_process_stats", alen) == 0) { @@ -374,16 +382,16 @@ main(int argc, char **argv) "[-syslog[=FACILITY]] " "[-p ] [-rebuild] " "[-groupdepth ] " - "[-restricted] [-rxmaxmtu ]" + "[-restricted] [-rxmaxmtu ] [-rxbind] " "[-enable_peer_stats] [-enable_process_stats] " "[-default_access default_user_access default_group_access] " "[-help]\n"); #else /* AFS_NT40_ENV */ printf("Usage: ptserver [-database ] " "[-auditlog ] " - "[-p ] [-rebuild] " + "[-p ] [-rebuild] [-rxbind] " "[-default_access default_user_access default_group_access] " - "[-restricted] [-rxmaxmtu ]" + "[-restricted] [-rxmaxmtu ] [-rxbind] " "[-groupdepth ] " "[-help]\n"); #endif #else @@ -394,13 +402,13 @@ main(int argc, char **argv) "[-p ] [-rebuild] " "[-enable_peer_stats] [-enable_process_stats] " "[-default_access default_user_access default_group_access] " - "[-restricted] [-rxmaxmtu ]" + "[-restricted] [-rxmaxmtu ] [-rxbind] " "[-help]\n"); #else /* AFS_NT40_ENV */ printf("Usage: ptserver [-database ] " "[-auditlog ] " "[-default_access default_user_access default_group_access] " - "[-restricted] [-rxmaxmtu ]" + "[-restricted] [-rxmaxmtu ] [-rxbind] " "[-p ] [-rebuild] " "[-help]\n"); #endif #endif @@ -493,6 +501,25 @@ main(int argc, char **argv) * and the header are in separate Ubik buffers then 120 buffers may be * required. */ ubik_nBuffers = 120 + /*fudge */ 40; + + if (rxBind) { + afs_int32 ccode; + if (AFSDIR_SERVER_NETRESTRICT_FILEPATH || + AFSDIR_SERVER_NETINFO_FILEPATH) { + char reason[1024]; + ccode = parseNetFiles(SHostAddrs, NULL, NULL, + ADDRSPERSITE, reason, + AFSDIR_SERVER_NETINFO_FILEPATH, + AFSDIR_SERVER_NETRESTRICT_FILEPATH); + } else { + ccode = rx_getAllAddr(SHostAddrs, ADDRSPERSITE); + } + if (ccode == 1) { + host = SHostAddrs[0]; + rx_InitHost(host, htons(AFSCONF_PROTPORT)); + } + } + code = ubik_ServerInitByInfo(myHost, htons(AFSCONF_PROTPORT), &info, &clones, pr_dbaseName, &dbase); @@ -519,7 +546,7 @@ main(int argc, char **argv) } tservice = - rx_NewService(0, PRSRV, "Protection Server", sc, 3, + rx_NewServiceHost(host, 0, PRSRV, "Protection Server", sc, 3, PR_ExecuteRequest); if (tservice == (struct rx_service *)0) { fprintf(stderr, "ptserver: Could not create new rx service.\n"); @@ -529,7 +556,7 @@ main(int argc, char **argv) rx_SetMaxProcs(tservice, lwps); tservice = - rx_NewService(0, RX_STATS_SERVICE_ID, "rpcstats", sc, 3, + rx_NewServiceHost(host, 0, RX_STATS_SERVICE_ID, "rpcstats", sc, 3, RXSTATS_ExecuteRequest); if (tservice == (struct rx_service *)0) { fprintf(stderr, "ptserver: Could not create new rx service.\n"); diff --git a/src/rx/rx.c b/src/rx/rx.c index 32e70d3..5cc7594 100644 --- a/src/rx/rx.c +++ b/src/rx/rx.c @@ -1361,9 +1361,10 @@ rxi_SetCallNumberVector(register struct rx_connection *aconn, service name might be used for probing for statistics) */ struct rx_service * -rx_NewService(u_short port, u_short serviceId, char *serviceName, - struct rx_securityClass **securityObjects, int nSecurityObjects, - afs_int32(*serviceProc) (struct rx_call * acall)) +rx_NewServiceHost(afs_uint32 host, u_short port, u_short serviceId, + char *serviceName, struct rx_securityClass **securityObjects, + int nSecurityObjects, + afs_int32(*serviceProc) (struct rx_call * acall)) { osi_socket socket = OSI_NULLSOCKET; register struct rx_service *tservice; @@ -1394,7 +1395,7 @@ rx_NewService(u_short port, u_short serviceId, char *serviceName, for (i = 0; i < RX_MAX_SERVICES; i++) { register struct rx_service *service = rx_services[i]; if (service) { - if (port == service->servicePort) { + if (port == service->servicePort && host == service->serviceHost) { if (service->serviceId == serviceId) { /* The identical service has already been * installed; if the caller was intending to @@ -1435,6 +1436,7 @@ rx_NewService(u_short port, u_short serviceId, char *serviceName, service = tservice; service->magic = MAGIC_RXSVC; service->socket = socket; + service->serviceHost = host; service->servicePort = port; service->serviceId = serviceId; service->serviceName = serviceName; @@ -1458,6 +1460,14 @@ rx_NewService(u_short port, u_short serviceId, char *serviceName, return 0; } +struct rx_service * +rx_NewService(u_short port, u_short serviceId, char *serviceName, + struct rx_securityClass **securityObjects, int nSecurityObjects, + afs_int32(*serviceProc) (struct rx_call * acall)) +{ + return rx_NewServiceHost(htonl(INADDR_ANY), port, serviceId, serviceName, securityObjects, nSecurityObjects, serviceProc); +} + /* Generic request processing loop. This routine should be called * by the implementation dependent rx_ServerProc. If socketp is * non-null, it will be set to the file descriptor that this thread diff --git a/src/rx/rx.h b/src/rx/rx.h index f4dd0b2..574d0ae 100644 --- a/src/rx/rx.h +++ b/src/rx/rx.h @@ -310,6 +310,7 @@ struct rx_connection { struct rx_service { int magic; u_short serviceId; /* Service number */ + afs_uint32 serviceHost; /* IP address for this service */ u_short servicePort; /* UDP port for this service */ char *serviceName; /* Name of the service */ osi_socket socket; /* socket structure or file descriptor */ diff --git a/src/rx/rx_prototypes.h b/src/rx/rx_prototypes.h index 1e098a1..ecb94cc 100644 --- a/src/rx/rx_prototypes.h +++ b/src/rx/rx_prototypes.h @@ -53,6 +53,15 @@ extern struct rx_service *rx_NewService(u_short port, u_short serviceId, afs_int32(*serviceProc) (struct rx_call * acall)); +extern struct rx_service *rx_NewServiceHost(afs_uint32 host, u_short port, + u_short serviceId, + char *serviceName, + struct rx_securityClass + **securityObjects, + int nSecurityObjects, + afs_int32(*serviceProc) (struct + rx_call * + acall)); extern void rxi_ServerProc(int threadID, struct rx_call *newcall, osi_socket * socketp); extern void rx_WakeupServerProcs(void); diff --git a/src/ubik/ubik.c b/src/ubik/ubik.c index e0e7838..2fad57a 100644 --- a/src/ubik/ubik.c +++ b/src/ubik/ubik.c @@ -240,6 +240,8 @@ ubik_ServerInitCommon(afs_int32 myHost, short myPort, ubik_sc[secIndex] = secClass; } } + /* for backwards compat this should keep working as it does now + and not host bind */ code = rx_Init(myPort); if (code < 0) return code; diff --git a/src/update/server.c b/src/update/server.c index 54b1917..6a206d7 100644 --- a/src/update/server.c +++ b/src/update/server.c @@ -69,6 +69,11 @@ char *whoami; static int Quit(); +int rxBind = 0; + +#define ADDRSPERSITE 16 /* Same global is in rx/rx_user.c */ +afs_uint32 SHostAddrs[ADDRSPERSITE]; + /* check whether caller is authorized to manage RX statistics */ int update_rxstat_userok(struct rx_call *call) @@ -183,6 +188,7 @@ main(int argc, char *argv[]) { struct rx_securityClass *securityObjects[3]; struct rx_service *service; + afs_uint32 host = htonl(INADDR_ANY); int a = 0; rxkad_level level; @@ -234,15 +240,20 @@ main(int argc, char *argv[]) for (a = 1; a < argc; a++) { if (argv[a][0] == '-') { /* parse options */ - char arg[256]; - lcstring(arg, argv[a], sizeof(arg)); - newLevel = rxkad_StringToLevel(&argv[a][1]); - if (newLevel != -1) { - level = newLevel; /* set new level */ + if (strcmp(argv[a], "-rxbind") == 0) { + rxBind = 1; continue; + } else { + char arg[256]; + lcstring(arg, argv[a], sizeof(arg)); + newLevel = rxkad_StringToLevel(&argv[a][1]); + if (newLevel != -1) { + level = newLevel; /* set new level */ + continue; + } } usage: - Quit("Usage: upserver [+] [-crypt +] [-clear +] [-auth +] [-help]\n"); + Quit("Usage: upserver [+] [-crypt +] [-clear +] [-auth +] [-rxbind] [-help]\n"); } else { int dirlen; if (nDirs >= sizeof(dirName) / sizeof(dirName[0])) @@ -270,9 +281,25 @@ main(int argc, char *argv[]) exit(1); } + if (rxBind) { + afs_int32 ccode; + if (AFSDIR_SERVER_NETRESTRICT_FILEPATH || + AFSDIR_SERVER_NETINFO_FILEPATH) { + char reason[1024]; + ccode = parseNetFiles(SHostAddrs, NULL, NULL, + ADDRSPERSITE, reason, + AFSDIR_SERVER_NETINFO_FILEPATH, + AFSDIR_SERVER_NETRESTRICT_FILEPATH); + } else { + ccode = rx_getAllAddr(SHostAddrs, ADDRSPERSITE); + } + if (ccode == 1) + host = SHostAddrs[0]; + } + /* Initialize Rx, telling it port number this server will use for its * single service */ - if (rx_Init(htons(AFSCONF_UPDATEPORT)) < 0) + if (rx_InitHost(host, htons(AFSCONF_UPDATEPORT)) < 0) Quit("rx_init"); /* Create a single security object, in this case the null security object, @@ -296,8 +323,8 @@ main(int argc, char *argv[]) * which is called to decode requests is passed in here * (UPDATE_ExecuteRequest). */ service = - rx_NewService(0, UPDATE_SERVICEID, "UPDATE", securityObjects, 3, - UPDATE_ExecuteRequest); + rx_NewServiceHost(host, 0, UPDATE_SERVICEID, "UPDATE", securityObjects, + 3, UPDATE_ExecuteRequest); if (service == (struct rx_service *)0) Quit("rx_NewService"); rx_SetMaxProcs(service, 2); diff --git a/src/viced/viced.c b/src/viced/viced.c index a796337..1440e8b 100644 --- a/src/viced/viced.c +++ b/src/viced/viced.c @@ -172,6 +172,7 @@ int SawPctSpare; int debuglevel = 0; int printBanner = 0; int rxJumbograms = 1; /* default is to send and receive jumbograms. */ +int rxBind = 0; /* don't bind */ int rxMaxMTU = -1; afs_int32 implicitAdminRights = PRSFS_LOOKUP; /* The ADMINISTER right is * already implied */ @@ -889,6 +890,7 @@ FlagMsg() strcat(buffer, "[-rxdbg (enable rx debugging)] "); strcat(buffer, "[-rxdbge (enable rxevent debugging)] "); strcat(buffer, "[-rxmaxmtu ] "); + strcat(buffer, "[-rxbind (bind the Rx socket to one address)] "); #ifdef AFS_DEMAND_ATTACH_FS strcat(buffer, "[-fs-state-dont-save (disable state save during shutdown)] "); strcat(buffer, "[-fs-state-dont-restore (disable state restore during startup)] "); @@ -1266,6 +1268,8 @@ ParseArgs(int argc, char *argv[]) #endif else if (!strcmp(argv[i], "-nojumbo")) { rxJumbograms = 0; + } else if (!strcmp(argv[i], "-rxbind")) { + rxBind = 1; } else if (!strcmp(argv[i], "-rxmaxmtu")) { if ((i + 1) >= argc) { fprintf(stderr, "missing argument for -rxmaxmtu\n"); @@ -1776,6 +1780,43 @@ Do_VLRegisterRPC() } afs_int32 +SetupVL() +{ + afs_int32 code; + extern int rxi_numNetAddrs; + extern afs_uint32 rxi_NetAddrs[]; + +#ifndef AFS_NT40_ENV + if (AFSDIR_SERVER_NETRESTRICT_FILEPATH || AFSDIR_SERVER_NETINFO_FILEPATH) { + /* + * Find addresses we are supposed to register as per the netrestrict + * and netinfo files (/usr/afs/local/NetInfo and + * /usr/afs/local/NetRestict) + */ + char reason[1024]; + afs_int32 code = parseNetFiles(FS_HostAddrs, NULL, NULL, + ADDRSPERSITE, reason, + AFSDIR_SERVER_NETINFO_FILEPATH, + AFSDIR_SERVER_NETRESTRICT_FILEPATH); + if (code < 0) { + ViceLog(0, ("Can't register any valid addresses: %s\n", reason)); + exit(1); + } + FS_HostAddr_cnt = (afs_uint32) code; + } else +#endif + { + FS_HostAddr_cnt = rx_getAllAddr(FS_HostAddrs, ADDRSPERSITE); + } + + if (FS_HostAddr_cnt == 1 && rxBind == 1) + code = FS_HostAddrs[0]; + else + code = htonl(INADDR_ANY); + return code; +} + +afs_int32 InitVL() { afs_int32 code; @@ -1806,30 +1847,7 @@ InitVL() /* A good sysid file exists; inform the vlserver. If any conflicts, * we always use the latest interface available as the real truth. */ -#ifndef AFS_NT40_ENV - if (AFSDIR_SERVER_NETRESTRICT_FILEPATH || AFSDIR_SERVER_NETINFO_FILEPATH) { - /* - * Find addresses we are supposed to register as per the netrestrict - * and netinfo files (/usr/afs/local/NetInfo and - * /usr/afs/local/NetRestict) - */ - char reason[1024]; - afs_int32 code = parseNetFiles(FS_HostAddrs, NULL, NULL, - ADDRSPERSITE, reason, - AFSDIR_SERVER_NETINFO_FILEPATH, - AFSDIR_SERVER_NETRESTRICT_FILEPATH); - if (code < 0) { - ViceLog(0, ("Can't register any valid addresses: %s\n", reason)); - exit(1); - } - FS_HostAddr_cnt = (afs_uint32) code; - } else -#endif - { - FS_HostAddr_cnt = rx_getAllAddr(FS_HostAddrs, ADDRSPERSITE); - } - FS_registered = 1; code = Do_VLRegisterRPC(); return code; } @@ -1854,6 +1872,7 @@ main(int argc, char *argv[]) #endif int curLimit; time_t t; + afs_uint32 rx_bindhost; #ifdef AFS_AIX32_ENV struct sigaction nsa; @@ -2019,7 +2038,9 @@ main(int argc, char *argv[]) #endif if (udpBufSize) rx_SetUdpBufSize(udpBufSize); /* set the UDP buffer size for receive */ - if (rx_Init((int)htons(7000)) < 0) { + rx_bindhost = SetupVL(); + + if (rx_InitHost(rx_bindhost, (int)htons(7000)) < 0) { ViceLog(0, ("Cannot initialize RX\n")); exit(1); } @@ -2036,11 +2057,12 @@ main(int argc, char *argv[]) sc[1] = 0; /* rxvab_NewServerSecurityObject(key1, 0) */ sc[2] = rxkad_NewServerSecurityObject(rxkad_clear, NULL, get_key, NULL); sc[3] = rxkad_NewServerSecurityObject(rxkad_crypt, NULL, get_key, NULL); - tservice = rx_NewService( /* port */ 0, /* service id */ 1, /*service name */ - "AFS", - /* security classes */ sc, - /* numb sec classes */ - 4, RXAFS_ExecuteRequest); + tservice = rx_NewServiceHost(rx_bindhost, /* port */ 0, /* service id */ + 1, /*service name */ + "AFS", + /* security classes */ sc, + /* numb sec classes */ + 4, RXAFS_ExecuteRequest); if (!tservice) { ViceLog(0, ("Failed to initialize RX, probably two servers running.\n")); diff --git a/src/vlserver/vlserver.c b/src/vlserver/vlserver.c index 8bc9e01..e0a2319 100644 --- a/src/vlserver/vlserver.c +++ b/src/vlserver/vlserver.c @@ -72,6 +72,10 @@ int LogLevel = 0; int smallMem = 0; int rxJumbograms = 1; /* default is to send and receive jumbo grams */ int rxMaxMTU = -1; +afs_int32 rxBind = 0; + +#define ADDRSPERSITE 16 /* Same global is in rx/rx_user.c */ +afs_uint32 SHostAddrs[ADDRSPERSITE]; static void CheckSignal_Signal() @@ -144,6 +148,7 @@ main(argc, argv) extern int rx_extraPackets; char commandLine[150]; char clones[MAXHOSTSPERCELL]; + afs_uint32 host = ntohl(INADDR_ANY); #ifdef AFS_AIX32_ENV /* @@ -179,6 +184,9 @@ main(argc, argv) } else if (strcmp(argv[index], "-nojumbo") == 0) { rxJumbograms = 0; + } else if (strcmp(argv[index], "-rxbind") == 0) { + rxBind = 1; + } else if (!strcmp(argv[index], "-rxmaxmtu")) { if ((index + 1) >= argc) { fprintf(stderr, "missing argument for -rxmaxmtu\n"); @@ -245,14 +253,14 @@ main(argc, argv) /* support help flag */ #ifndef AFS_NT40_ENV printf("Usage: vlserver [-p ] [-nojumbo] " - "[-rxmaxmtu ] " + "[-rxmaxmtu ] [-rxbind] " "[-auditlog ] " "[-syslog[=FACILITY]] " "[-enable_peer_stats] [-enable_process_stats] " "[-help]\n"); #else printf("Usage: vlserver [-p ] [-nojumbo] " - "[-rxmaxmtu ] " + "[-rxmaxmtu ] [-rxbind] " "[-auditlog ] " "[-enable_peer_stats] [-enable_process_stats] " "[-help]\n"); @@ -323,6 +331,24 @@ main(argc, argv) if (noAuth) afsconf_SetNoAuthFlag(tdir, 1); + if (rxBind) { + afs_int32 ccode; + if (AFSDIR_SERVER_NETRESTRICT_FILEPATH || + AFSDIR_SERVER_NETINFO_FILEPATH) { + char reason[1024]; + ccode = parseNetFiles(SHostAddrs, NULL, NULL, + ADDRSPERSITE, reason, + AFSDIR_SERVER_NETINFO_FILEPATH, + AFSDIR_SERVER_NETRESTRICT_FILEPATH); + } else { + ccode = rx_getAllAddr(SHostAddrs, ADDRSPERSITE); + } + if (ccode == 1) { + host = SHostAddrs[0]; + rx_InitHost(host, htons(AFSCONF_VLDBPORT)); + } + } + ubik_nBuffers = 512; ubik_CRXSecurityProc = afsconf_ClientAuth; ubik_CRXSecurityRock = (char *)tdir; @@ -351,8 +377,9 @@ main(argc, argv) sc[0] = rxnull_NewServerSecurityObject(); sc[1] = (struct rx_securityClass *)0; sc[2] = rxkad_NewServerSecurityObject(0, tdir, afsconf_GetKey, NULL); + tservice = - rx_NewService(0, USER_SERVICE_ID, "Vldb server", sc, 3, + rx_NewServiceHost(host, 0, USER_SERVICE_ID, "Vldb server", sc, 3, VL_ExecuteRequest); if (tservice == (struct rx_service *)0) { printf("vlserver: Could not create VLDB_SERVICE rx service\n"); @@ -364,7 +391,7 @@ main(argc, argv) rx_SetMaxProcs(tservice, lwps); tservice = - rx_NewService(0, RX_STATS_SERVICE_ID, "rpcstats", sc, 3, + rx_NewServiceHost(host, 0, RX_STATS_SERVICE_ID, "rpcstats", sc, 3, RXSTATS_ExecuteRequest); if (tservice == (struct rx_service *)0) { printf("vlserver: Could not create rpc stats rx service\n"); diff --git a/src/volser/volmain.c b/src/volser/volmain.c index ca643b5..a783a03 100644 --- a/src/volser/volmain.c +++ b/src/volser/volmain.c @@ -95,6 +95,10 @@ int lwps = 9; int udpBufSize = 0; /* UDP buffer size for receive */ int Testing = 0; /* for ListViceInodes */ +int rxBind = 0; + +#define ADDRSPERSITE 16 /* Same global is in rx/rx_user.c */ +afs_uint32 SHostAddrs[ADDRSPERSITE]; #define VS_EXIT(code) { \ osi_audit(VS_ExitEvent, code, AUD_END); \ @@ -244,6 +248,7 @@ main(int argc, char **argv) int rxJumbograms = 1; /* default is to send and receive jumbograms. */ int rxMaxMTU = -1; int bufSize = 0; /* temp variable to read in udp socket buf size */ + afs_uint32 host = ntohl(INADDR_ANY); #ifdef AFS_AIX32_ENV /* @@ -288,6 +293,8 @@ main(int argc, char **argv) DoLogging = 1; } else if (strcmp(argv[code], "-help") == 0) { goto usage; + } else if (strcmp(argv[code], "-rxbind") == 0) { + rxBind = 1; } else if (strcmp(argv[code], "-p") == 0) { lwps = atoi(argv[++code]); if (lwps > MAXLWP) { @@ -379,7 +386,7 @@ main(int argc, char **argv) #ifndef AFS_NT40_ENV printf("Usage: volserver [-log] [-p ] " "[-auditlog ] " - "[-nojumbo] [-rxmaxmtu ] " + "[-nojumbo] [-rxmaxmtu ] [-rxbind] " "[-udpsize ] " "[-syslog[=FACILITY]] " "[-enable_peer_stats] [-enable_process_stats] " @@ -387,7 +394,7 @@ main(int argc, char **argv) #else printf("Usage: volserver [-log] [-p ] " "[-auditlog ] " - "[-nojumbo] [-rxmaxmtu ] " + "[-nojumbo] [-rxmaxmtu ] [-rxbind] " "[-udpsize ] " "[-enable_peer_stats] [-enable_process_stats] " "[-help]\n"); @@ -426,7 +433,23 @@ main(int argc, char **argv) rx_nPackets = rxpackets; /* set the max number of packets */ if (udpBufSize) rx_SetUdpBufSize(udpBufSize); /* set the UDP buffer size for receive */ - code = rx_Init((int)htons(AFSCONF_VOLUMEPORT)); + if (rxBind) { + afs_int32 ccode; + if (AFSDIR_SERVER_NETRESTRICT_FILEPATH || + AFSDIR_SERVER_NETINFO_FILEPATH) { + char reason[1024]; + ccode = parseNetFiles(SHostAddrs, NULL, NULL, + ADDRSPERSITE, reason, + AFSDIR_SERVER_NETINFO_FILEPATH, + AFSDIR_SERVER_NETRESTRICT_FILEPATH); + } else { + ccode = rx_getAllAddr(SHostAddrs, ADDRSPERSITE); + } + if (ccode == 1) + host = SHostAddrs[0]; + } + + code = rx_InitHost(host, (int)htons(AFSCONF_VOLUMEPORT)); if (code) { fprintf(stderr, "rx init failed on socket AFSCONF_VOLUMEPORT %u\n", AFSCONF_VOLUMEPORT); @@ -478,7 +501,7 @@ main(int argc, char **argv) if (securityObjects[0] == (struct rx_securityClass *)0) Abort("rxnull_NewServerSecurityObject"); service = - rx_NewService(0, VOLSERVICE_ID, "VOLSER", securityObjects, 3, + rx_NewServiceHost(host, 0, VOLSERVICE_ID, "VOLSER", securityObjects, 3, AFSVolExecuteRequest); if (service == (struct rx_service *)0) Abort("rx_NewService");