diff -ruN pvm3.ori/Readme.IPv6 pvm3/Readme.IPv6 --- pvm3.ori/Readme.IPv6 1970-01-01 01:00:00.000000000 +0100 +++ pvm3/Readme.IPv6 2004-07-21 19:51:23.000000000 +0200 @@ -0,0 +1,247 @@ + PVM3.4.4 + IPv6 : Full grid connectivity +======================================== +This readme file describes the IPv6 (ANY platform) port of PVM. + +0. - PURPOSE: +1. - CHANGELOG: +2. - INSTALLATION NOTES: +3. - RUNNING YOUR PVM-GRID APPLICATIONS ON IPv6: +4. - KNOWN BUGS. +5. - TODO +6. - OPEN QUESTIONS: +7. - SUPPORT: +8. - DISCLAIMER: + + + +0. - PURPOSE: +------------- + +Some Beowulf clusters are designed so that not all nodes are visible +to the external world. This is commonly known as the NAT problem (Network +Address Translation) and it is inherently bound to the IPv4 protocol +address space of 32 bits. +In these cases, there is often a "front end" +node which connects to the world, and the rest of the nodes are on an +internal network. This has the disadvantage for PVM users running +on an outside computer who want to add the Beowulf computer to their +configuration: the PVM code on their computer will be unable to +communicate with the Beowulf nodes on the internal network. + +Some time ago, the BEOLIN port of PVM was introduced in order to solve +this problem by making the parallelism of the Beowulf computer +transparent to the user. This is done in a way similar to the MPP +ports of PVM for parallel computers such as the IBM SP2, Cray T3D and others. + +Today we present a new way to solve this problem based on the new +networking protocol: IPv6 (see RFC-2460 for more detailed info). Among +new features, address space is virtually increased into +"infinite" (128 bits vs. 32 bits). This will eventually enable +not only computers, but even cellulars and any sort of electronic devices + to connect the Internet. The NAT patch will become use-less, and + GRID/P2P(peer-to-peer) applications are thought to be among the main + beneficiaries of this new technology. + +Summing up: IPv6 provides the GRID with "mobile computing", as a +complement to "mobile computation" supplid by PVM. Former refers to +the fact of nodes of a network mobing about, while latter higlights +the notion that running programs need no to be forever tied to a +single network node. + +1. - CHANGELOG +--------------- + + - Fixed the iflist() command: Now you can use the pvmhostfile as usual. + - The pvmd-localtask daemon: + Initially this daemon was run on a UNIX socket. Then, due to + portability problems acrross platforms, it was implemented with a + TCP/IP socket on loopbak interface (127.0.0.1). It has been + fixed to run on IPv6 loopbak interface (::1) + + +2.- INSTALLATION NOTES: +------------------- +Ordinary PVM deployment skill required. Please, refer to corresponding +info (Readme, under pvm3 dir) + + 0) Prerequisites: + + - A UNIX O.S implementing IPv6 stack. Usually LINUX kernels >= + 2.4 do implement it. Also Freebsd >= 5.1, Solaris >= 8... + - Obviously, IPv6 connectivity at your beowulf. If you are in + trouble respect to this, try to setup a tunnel "6to4" by reading + some correponding bibliography, out of the scope of this document. + + 1) Download + + http://www.ngn.euro6ix.org/IPv6/pvm/pvm-3.4.4-v6-20040715.diff + http://www.netlib.org/pvm3/pvm3.4.4.tar.gz + + 2) Unroll the tar.gz and apply the patch. + + $bash-2.04$ tar xzvf pvm3.tar.gz + $bash-2.04$ patch -p0 < pvm-3.4.4-v6-20040715.diff + + 3) Compile the bundle the next way: Be carefull of using SSH protocol + + $bash-2.04$ export PVM_RSH=`which ssh` + $bash-2.04$ cd pvm3 + $bash-2.04$ export PVM_ROOT=`pwd` + $bash-2.04$ make CFLOPTS=-DIPv6 + +WARNING: + - If you don't use GNU make you may be on trouble when + aplying the flag CFLOPTS=-DIPv6 . If so, try to adjust manually the + file pvm3/conf/.def + - Take this patch as a Beta, a scratch , or a seed to go on + hacking. This is a transient solution. Not so steady to + run benchmark problems. Take a look into the BUGS and + TODO sections. + - As far as I know, (2004-05-31) no official UNIX distro + include IPv6-support for NFS and NIS. This means you cannot + deploy the Beowulf Cluster on a distributed file system on + IPv6 (at least for NFS, maybe others...). The tests have been run + by using the ordinary IPv4 NFS ones, I mean, our benchmark + intranet could run both IPv4 and IPv6. Obviously, PVM UDP + daemons were running IPv6. As a matter of abstraction layer + provided by the file system, no problems are expected when + these protocols NFS/NIS become IPv6 available... + - If you cannot export the NFS outside your intranetwork, you + can always adjust values on pvmhostfile in order to indicate + default search paths... + +3.- RUNNING YOUR PVM-GRID APPLICATIONS ON IPv6: +----------------------------------------------------- + +Until now, it has been tested only on a i386-[linux-freebsd] +Beowulf. More precisely, SuSE 8.1 and FreeBsd 5.1 , but it still not very matured + +DNS was introduced to make easier the "decimal-dot notation" +154.346.34.145 . IPv6 will make it even harder, with addresses like +2005:35a4:12ff:6730:a423::12. You are encouraged to use always DNS +names. If registering DNS entries is not always possible on a benchmark +beowulf, just try to write them on the local hosts file (/etc/hosts on +linux), as was the use prior to DNS system. + + +For a simple test: +1) + + bash-2.04$ cd pvm3 + bash-2.04$ make e + +This will compile the examples provided with the tar.gz bundle . + +2) + bash-2.04$ export PVM_ROOT="/path/to/ipv6/pvm/patch" + bash-2.04$ alias pvm='$PVM_ROOT/lib/$PVM_ARCH/pvm' + bash-2.04$ export PVM_RSH=`which ssh` # Very important !! + bash-2.04$ pvm + + Take a look into /tmp/pvml.: + If you see a line with some dotted address like: + + LINUX [2004:2a04:800:ee10:3434::2] + + this means you are running PVM on IPv6 !!! + +Also type + + bash-2.04$netstat -uan + +to check your pvmd, pvmd's daemons running... + +3) + pvm> add pc2.ipv6lab.inv + user@pc2.ipv6lab.inv's password: + (type whatever corresponds. To do this automatically, you + can enable an ssh-agent. Read original README to know how to) + pvm> conf + pvm> spawn -5 -> hello + + + You should watch alternate "hello worlds" from the virtual nodes... +Take a look into /tmp/pvml.uid... + + +Porting your personal applications. +==================================== +As old PVM used to, the new PVM frees you from dealing with low-level +aspects like networking connectivity and transport. So,YOU DO NOT HAVE +TO MODIFY your original application source code, BUT YOU HAVE TO RE-COMPILE AND +LINK IT against the new library you get in the previous phase, namely +libpvm.a . Be carefull of exporting the rigth environment PATH: + + bash-2.04$ export PVM_ROOT="/path/to/ipv6/pvm/patch" + + +4.- KNOWN BUGS: (Important !!!) +----------------------------- + + - Please, use SSH protocol to make the master setup the slaves pvmd + daemon. You can do this by overwriting the environment variable + PVM_RSH. Most probably no IPv6 system export RSH service . + + bash-2.04$ export PVM_RSH=`which ssh` + +5.- TODO: +----------- + + - Make cleaner the patch ;-) + - Somewhere around a call "sendto()" we have to adjust the length + of the bytes we send, since the new data "struct + sockaddr_storage" is greater than traditional "struct + sockaddr_in". I guess some alligment problems should arise, though + empirically this has not been the case. + + +6.- OPEN QUESTIONS: +--------------- + + Those interested on this section are kindly required to read the more +detailed report: + - http://www.gmonline.demon.co.uk/cscene/CS6/CS6-03.htm + +and contributing with any sugestion by e-mail to +(rafael dot martinez at novagnet dot com) + +* should PVM support dual-stack protocol (IPv6-IPv4)? + +In my opinion, no. Tratiditional client/server models based on +asymetric processing fit entirely this concept, as explained on the +pointed URL, but PVM configuration scheme (globally kept in host table) +may be hard to maintain by considering both types of +connectivity. +Consider the following scenario: at least, the MASTER node is +provided dual-stack node. If a IPv6 node is added to the host-table, +then IPv4-only nodes will not reach it, becoming likely +to be dropped. If a IPv4-only node is entered, then IPv4-NAT we want to +avoid will be present again. Thus, would derive on a desychronized +host-table among the whole Bewoulf. + +If you find problems with IP(v6-v4) connectivity, it would be cleaner +trying to setup tunnel "6to4" instead of NAT patch. Search for +bibliography on how to deploy it. + + + +7.- SUPPORT: +--------- + +Suggestions, contributions are welcome at +(rafael dot martinez at novagnet dot com) + + +8.- DISCLAIMER: +----------- + +I don't know why the following has to be in all caps, but you know +lawyers. + +THIS IS A DEMONSTRATION RELEASE. THE AUTHOR MAKES NO REPRESENTATION +ABOUT THE SUITABILITY OF THIS SOFTWARE FOR ANY OTHER PURPOSE. IT IS +PROVIDED "AS IS" WITHOUT EXPRESSED OR IMPLIED WARRANTY. + +THIS NOTICE MUST BE MAINTAINED IN ALL DISTRIBUTED VERSIONS. + + Binary files pvm3.ori/bin/LINUX/pvm_gstat and pvm3/bin/LINUX/pvm_gstat differ Binary files pvm3.ori/bin/LINUX/pvmgroups and pvm3/bin/LINUX/pvmgroups differ Binary files pvm3.ori/bin/LINUX/pvmgs and pvm3/bin/LINUX/pvmgs differ Binary files pvm3.ori/bin/LINUX/tracer and pvm3/bin/LINUX/tracer differ Binary files pvm3.ori/bin/LINUX/trcsort and pvm3/bin/LINUX/trcsort differ Binary files pvm3.ori/lib/LINUX/libfpvm3.a and pvm3/lib/LINUX/libfpvm3.a differ Binary files pvm3.ori/lib/LINUX/libgpvm3.a and pvm3/lib/LINUX/libgpvm3.a differ Binary files pvm3.ori/lib/LINUX/libpvm3.a and pvm3/lib/LINUX/libpvm3.a differ Binary files pvm3.ori/lib/LINUX/libpvmtrc.a and pvm3/lib/LINUX/libpvmtrc.a differ Binary files pvm3.ori/lib/LINUX/pvm and pvm3/lib/LINUX/pvm differ Binary files pvm3.ori/lib/LINUX/pvmd3 and pvm3/lib/LINUX/pvmd3 differ Binary files pvm3.ori/lib/LINUX/pvmgs and pvm3/lib/LINUX/pvmgs differ diff -ruN pvm3.ori/src/ddpro.c pvm3/src/ddpro.c --- pvm3.ori/src/ddpro.c 2001-09-27 01:35:19.000000000 +0200 +++ pvm3/src/ddpro.c 2004-07-21 19:11:06.000000000 +0200 @@ -420,7 +420,11 @@ void pvmbailout(); char *inadport_hex(); char *getenv(); +#ifdef IPv6 /* Format routines. Should be called hex_in6adport, but we keep for historical reasons */ +void hex_inadport __ProtoGlarp__ (( char *, struct sockaddr_storage * )); +#else void hex_inadport __ProtoGlarp__ (( char *, struct sockaddr_in * )); +#endif void mesg_rewind __ProtoGlarp__ (( struct pmsg * )); void tev_send_newtask(); @@ -827,7 +831,12 @@ int count; int ngood; int ntid; +#ifdef IPv6 + struct addrinfo hints,*res; + struct in6_addr in6addr; /* XXX hack */ +#else struct hostent *he; +#endif int maxhostid = (tidhmask >> ffs(tidhmask) - 1); int hh; int pid; @@ -903,7 +912,11 @@ hp = hosts->ht_hosts[hosts->ht_local]; +#ifdef IPv6 + if (pvmisloopback(&hp->hd_sad)) { /* TODO: In IPv6, should we evaluate also the scope of the addr ? */ +#else if ( hp->hd_sad.sin_addr.s_addr == htonl(0x7f000001) ) { +#endif /* damn, we're hosed. bail on host adds with new */ /* PvmIPLoopback error code... */ @@ -926,14 +939,28 @@ if (hp->hd_err) continue; +#ifdef IPv6 + memset(&hints,0,sizeof(struct addrinfo)); + hints.ai_family = PF_INET6; + hints.ai_socktype = SOCK_DGRAM; + if (!getaddrinfo(hp->hd_aname ? hp->hd_aname : hp->hd_name,"0",&hints,&res)) { + BCOPY(res->ai_addr, (char*)&hp->hd_sad, + res->ai_addrlen); + freeaddrinfo(res); +#else if (he = gethostbyname(hp->hd_aname ? hp->hd_aname : hp->hd_name)) { BCOPY(he->h_addr_list[0], (char*)&hp->hd_sad.sin_addr, sizeof(struct in_addr)); +#endif } else { if (pvmdebmask & PDMSTARTUP) { pvmlogprintf( +#ifdef IPv6 + "start_slaves() can't getaddrinfo %s\n", +#else "start_slaves() can't gethostbyname: %s\n", +#endif hp->hd_name); } hp->hd_err = PvmNoHost; @@ -945,7 +972,11 @@ if (!(hp->hd_flag & HF_OVERLOAD)) { for (hh = hosts->ht_last; hh > 0; hh--) if ((hp2 = hosts->ht_hosts[hh]) +#ifdef IPv6 + && (pvmcomparein6addr(&hp2->hd_sad,&hp->hd_sad) == 0)) { +#else && (hp2->hd_sad.sin_addr.s_addr == hp->hd_sad.sin_addr.s_addr)) { +#endif hp->hd_err = PvmDupHost; break; } @@ -955,8 +986,12 @@ /* make sure new ones aren't duplicated */ for (j = i; j-- > 0; ) +#ifdef IPv6 + if (pvmcomparein6addr(&hp2->hd_sad,&hp->hd_sad) == 0) { +#else if (hp->hd_sad.sin_addr.s_addr == wxp->w_hosts[j]->hd_sad.sin_addr.s_addr) { +#endif hp->hd_err = PvmDupHost; break; } @@ -1033,7 +1068,11 @@ len = strlen( (hp->hd_dpath ? hp->hd_dpath : pvmdpath) ) + 1 + strlen( (hp->hd_sopts && !strcmp(hp->hd_sopts, "ms") ? "-S" : "-s") ) + 1 +#ifdef IPv6 /* To fix: What arbitrary length ? */ + + 2 + INET6_ADDRSTRLEN+50 + 1 +#else + 2 + 16 + 1 +#endif + 2 + strlen( hp->hd_name ) + 1 + 5 * ( 16 + 1 ); buf = TALLOC( len, char, "hdall" ); @@ -1058,7 +1097,11 @@ len = strlen( winpvmdpath ) + 1 + strlen( (hp->hd_sopts && !strcmp(hp->hd_sopts, "ms") ? "-S" : "-s") ) + 1 +#ifdef IPv6 /* To fix: What arbitrary length ? */ + + 2 + INET6_ADDRSTRLEN+50 + 1 +#else + 2 + 16 + 1 +#endif + 2 + strlen( hp->hd_name ) + 1 + 5 * ( 16 + 1 ); buf = TALLOC( len, char, "hdallwin" ); @@ -1722,7 +1765,11 @@ { int count; /* number of hosts in message */ int hh; +#ifdef IPv6 + char buf[INET6_ADDRSTRLEN+50]; /* for converting sockaddr */ +#else char buf[16]; /* for converting sockaddr */ +#endif struct pmsg *mp2; /* unpack new host table params */ diff -ruN pvm3.ori/src/host.c pvm3/src/host.c --- pvm3.ori/src/host.c 2001-09-27 01:35:18.000000000 +0200 +++ pvm3/src/host.c 2004-07-20 23:42:46.000000000 +0200 @@ -229,6 +229,9 @@ char *inadport_decimal(); +#ifdef IPv6 +size_t sa_len(struct sockaddr_storage *); +#endif /*************** @@ -266,7 +269,9 @@ BZERO((char*)hp, sizeof(struct hostd)); hp->hd_ref = 1; hp->hd_hostpart = hh << (ffs(tidhmask) - 1); +#ifndef IPv6 hp->hd_sad.sin_family = AF_INET; +#endif hp->hd_txq = pk_new(0); hp->hd_opq = pk_new(0); hp->hd_rxq = pk_new(0); @@ -812,9 +817,15 @@ char buf[512]; /* line buffer */ int lnum = 0; /* line counter */ int err = 0; /* error count */ +#ifdef IPv6 + struct addrinfo hints,*res; + struct in6_addr *my_in_addrs; /* XXX Remember: The pvmd server only opens IPv6 addresses */ + struct sockaddr_in6 *sa6; /* XXX : Subtle hack to get access into the binary sin6_addr */ +#else struct hostent *he; - char *p; struct in_addr *my_in_addrs; +#endif + char *p; int num_addrs; int i; int maxhostid = tidhmask >> (ffs(tidhmask) - 1); @@ -885,6 +896,21 @@ /* look up ip addr */ +#ifdef IPv6 + memset(&hints,0,sizeof(struct addrinfo)); + hints.ai_family = PF_INET6; + hints.ai_socktype = SOCK_DGRAM; + if (getaddrinfo(hp->hd_aname?hp->hd_aname: hp->hd_name,"0",&hints,&res)) { + pvmlogprintf("readhostfile() %s %d: %s: can't getaddrinfo\n", + fn, lnum, hp->hd_name); + err++; + goto badline; + } + BCOPY(res->ai_addr, (char*)&hp->hd_sad, + res->ai_addrlen); + freeaddrinfo(res); + sa6 = (struct sockaddr_sin6 *) &hp->hd_sad ; +#else if (!(he = gethostbyname(hp->hd_aname ? hp->hd_aname : hp->hd_name))) { pvmlogprintf("readhostfile() %s %d: %s: can't gethostbyname\n", fn, lnum, hp->hd_name); @@ -893,13 +919,21 @@ } BCOPY(he->h_addr_list[0], (char*)&hp->hd_sad.sin_addr, sizeof(struct in_addr)); +#endif /* mark master host to not start */ if (!(hp->hd_flag & HF_OVERLOAD)) for (i = num_addrs; i-- > 0; ) { +#ifdef IPv6 + if (BCMP((char*)&my_in_addrs[i],(char *)&sa6->sin6_addr, + sizeof(struct in6_addr)) == 0) { + +#else if (BCMP((char*)&my_in_addrs[i], (char*)&hp->hd_sad.sin_addr, sizeof(struct in_addr)) == 0) { +#endif + hp->hd_flag |= HF_NOSTART; break; } @@ -938,6 +972,7 @@ * Return list of addresses for active network interfaces. */ +#ifndef IPv6 #ifdef SIOCGIFCONF int @@ -1025,6 +1060,7 @@ #else /*SIOCGIFCONF*/ + int iflist(alp, np) struct in_addr **alp; /* return list of addresses */ @@ -1063,6 +1099,68 @@ } #endif /*SIOCGIFCONF*/ +#else /* IPv6 */ + + +int +iflist(alp, np) + struct in6_addr **alp; /* return list of addresses */ + int *np; /* return len of alp */ +{ + static struct in6_addr *iplist = 0; /* list of interface addrs found */ + int nip = 0; /* length of iplist */ + char **p; + + FILE *f; + char addr6[40], devname[20]; + struct sockaddr_in6 sap; + int plen, scope, dad_status, if_idx; + char addr6p[8][5]; + + + if (iplist) + PVM_FREE(iplist); + iplist = TALLOC(10, struct in6_addr, "ifl"); + +#ifdef IMA_LINUX +#ifndef _PATH_PROCNET_IFINET6 +#define _PATH_PROCNET_IFINET6 "/proc/net/if_inet6" +#endif /* _PATH_PROCNET_IFNET6 */ +#endif + + if ((f = fopen(_PATH_PROCNET_IFINET6, "r")) != NULL) { + while (fscanf(f, "%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %20s\n", + addr6p[0], addr6p[1], addr6p[2], addr6p[3], + addr6p[4], addr6p[5], addr6p[6], addr6p[7], + &if_idx, &plen, &scope, &dad_status, devname) != EOF) { + sprintf(addr6, "%s:%s:%s:%s:%s:%s:%s:%s", + addr6p[0], addr6p[1], addr6p[2], addr6p[3], + addr6p[4], addr6p[5], addr6p[6], addr6p[7]); + pvmlogprintf(" Got interface IPv6 %s\n",addr6); + inet_pton(AF_INET6, addr6, sap.sin6_addr.s6_addr); + if (nip > 0 && !(nip % 10)) + iplist = TREALLOC(iplist, (nip + 10), struct in6_addr); + memcpy(&iplist[nip],&sap.sin6_addr,sizeof(struct in6_addr)); + nip++; + + } + fclose(f); + } + else + { + fprintf(stderr, "can't open %s\n",_PATH_PROCNET_IFINET6); + goto bail; + } + + *alp = iplist; + *np = nip; + return 0; + +bail: + return -1; +} + +#endif /* IPv6 */ /* acav() diff -ruN pvm3.ori/src/host.h pvm3/src/host.h --- pvm3.ori/src/host.h 2001-09-27 01:35:21.000000000 +0200 +++ pvm3/src/host.h 2004-07-08 13:46:47.000000000 +0200 @@ -71,6 +71,9 @@ * */ +#ifdef IPv6 +#include /* Some O.S need it to be declared explicitly */ +#endif /* Host descriptor */ @@ -89,7 +92,11 @@ int hd_dsig; /* data signature */ int hd_err; /* error code */ int hd_mtu; /* max snd/rcv length */ +#ifdef IPv6 + struct sockaddr_storage hd_sad; /* UDP address/port */ +#else struct sockaddr_in hd_sad; /* UDP address/port */ +#endif int hd_rxseq; /* expected next seq num from host */ int hd_txseq; /* next tx seq num to host */ struct pkt *hd_txq; /* not-yet-sent packet queue to host */ diff -ruN pvm3.ori/src/lpvm.c pvm3/src/lpvm.c --- pvm3.ori/src/lpvm.c 2001-09-25 23:20:17.000000000 +0200 +++ pvm3/src/lpvm.c 2004-07-20 23:31:50.000000000 +0200 @@ -613,7 +613,6 @@ #include "../shmd/shmdproto.h" #endif - #ifndef max #define max(a,b) ((a)>(b)?(a):(b)) #endif @@ -633,7 +632,11 @@ ***************/ char *getenv(); +#ifdef IPv6 +void hex_inadport __ProtoGlarp__ (( char *, struct sockaddr_storage * )); +#else void hex_inadport __ProtoGlarp__ (( char *, struct sockaddr_in * )); +#endif extern char *inadport_decimal(); extern char *inadport_hex(); @@ -660,7 +663,11 @@ ***************/ static int mxfersingle = 1; /* mxfer returns after single frag */ +#ifdef IPv6 +static struct sockaddr_storage pvmourinet; /* our host ipv6 addr */ +#else static struct sockaddr_in pvmourinet; /* our host ip addr */ +#endif static struct ttpcb *ttlist = 0; /* dll of connected tasks */ static struct ttpcb *topvmd = 0; /* default route (to pvmd) */ static int pvmnfds = 0; /* 1 + highest bit set in fds */ @@ -1390,11 +1397,19 @@ #endif /*NOUNIXDOM*/ } else { +#ifdef IPv6 + pcbp->tt_osad.ss_family = AF_INET6; +#else pcbp->tt_osad.sin_family = AF_INET; +#endif hex_inadport(buf, &pcbp->tt_osad); while ((i = connect(pcbp->tt_fd, (struct sockaddr*)&pcbp->tt_osad, +#ifdef IPv6 + sa_len(&pcbp->tt_osad))) == -1 +#else sizeof(pcbp->tt_osad))) == -1 +#endif && errno == EINTR) ; if (i == -1) { @@ -2318,7 +2333,11 @@ int s; /* socket */ int sbf; /* temp TC_CONREQ message */ struct pmsg *up, *up2; +#ifdef IPv6 + struct sockaddr_storage sad; +#else struct sockaddr_in sad; +#endif int l; #ifdef SOCKLENISUINT #ifdef IMA_AIX4SP2 @@ -2426,12 +2445,20 @@ #endif /* !NOUNIXDOM */ /* Open a TCP direct Connection here, instead */ +#ifdef IPv6 + if ((s = socket(AF_INET6, SOCK_STREAM, 0)) == -1) { +#else if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) { +#endif pvmlogperror("mroute() socket"); } else { sad = pvmourinet; +#ifdef IPv6 + oslen = sa_len(&sad); +#else oslen = sizeof(sad); +#endif if (bind(s, (struct sockaddr*)&sad, oslen) == -1) { pvmlogperror("mroute() bind"); (void)close(s); @@ -2860,8 +2887,13 @@ try = 5; while (1) { /* goto is at the root of all good programming style */ hex_inadport(p, &topvmd->tt_osad); +#ifdef IPv6 + topvmd->tt_osad.ss_family = AF_INET6; + n = sa_len(&topvmd->tt_osad); +#else topvmd->tt_osad.sin_family = AF_INET; n = sizeof(topvmd->tt_osad); +#endif if (connect(topvmd->tt_fd, (struct sockaddr*)&topvmd->tt_osad, n) == -1) { @@ -3264,8 +3296,13 @@ hex_inadport(buf, &pvmourinet); #endif +#ifdef IPv6 + memset(&pvmourinet,0,sizeof(pvmourinet)); + pvmourinet.ss_family = AF_INET; +#else pvmourinet.sin_family = AF_INET; pvmourinet.sin_port = 0; +#endif pvm_upkint(&pvmschedtid, 1, 1); #endif diff -ruN pvm3.ori/src/lpvm.h pvm3/src/lpvm.h --- pvm3.ori/src/lpvm.h 2000-02-16 23:00:59.000000000 +0100 +++ pvm3/src/lpvm.h 2004-07-20 20:52:09.000000000 +0200 @@ -95,6 +95,7 @@ #include +#include /* Make it explicitly */ #ifndef WIN32 #include #ifndef NO_NETINET_TCP_H @@ -190,8 +191,13 @@ int tt_tid; /* tid of peer or 0 if master of list */ int tt_state; int tt_fd; /* fd of connection or -1 */ +#ifdef IPv6 + struct sockaddr_storage tt_sad; /* address of our socket */ + struct sockaddr_storage tt_osad; /* (authd) address of peer socket */ +#else struct sockaddr_in tt_sad; /* address of our socket */ struct sockaddr_in tt_osad; /* (authd) address of peer socket */ +#endif struct pmsg *tt_rxfrag; /* not-assembled incm msg */ struct frag *tt_rxf; /* partial incm frag */ #ifndef NOUNIXDOM diff -ruN pvm3.ori/src/lpvmgen.c pvm3/src/lpvmgen.c --- pvm3.ori/src/lpvmgen.c 2001-09-27 01:35:43.000000000 +0200 +++ pvm3/src/lpvmgen.c 2004-07-08 13:46:46.000000000 +0200 @@ -1909,7 +1909,6 @@ pvm_pkint(&count, 1, 1); for (i = 0; i < count; i++) pvm_pkstr(names[i]); - if (pvmschedtid) cc = msendrecv(pvmschedtid, SM_ADDHOST, PvmBaseContext); else diff -ruN pvm3.ori/src/pvmcruft.c pvm3/src/pvmcruft.c --- pvm3.ori/src/pvmcruft.c 2001-09-27 23:25:10.000000000 +0200 +++ pvm3/src/pvmcruft.c 2004-07-21 19:56:26.000000000 +0200 @@ -261,7 +261,9 @@ #endif #ifndef WIN32 #include +#include #include +#include #else #include #endif @@ -282,6 +284,7 @@ #include "pvmalloc.h" #include "lpvm.h" #include "global.h" +#include "bfunc.h" #ifdef WIN32 char *read_pvmregistry __ProtoGlarp__(( const char * )); @@ -293,8 +296,12 @@ ***************/ #ifndef RSHCOMMAND +#ifdef IPv6 +#define RSHCOMMAND "/usr/ucb/ssh" +#else #define RSHCOMMAND "/usr/ucb/rsh" #endif +#endif char *getenv(); @@ -658,29 +665,95 @@ #ifndef I860_NODE +#ifdef IPv6 +#ifndef SA_LEN +#define SA_LEN(sa) sa_len(sa) + +size_t sa_len(struct sockaddr_storage *sa) +{ + switch(sa->ss_family) { + case AF_INET: + return sizeof(struct sockaddr_in); + case AF_INET6: + return sizeof(struct sockaddr_in6); + default: + return sizeof(struct sockaddr_storage); + } +} +#endif /* SA_LEN */ + + /* hex_inadport() * +#ifdef IPv6 +* Kept the name for historical reasons. Should be rather hex_in6adport() +* Both routines are key. +* Takes a string of format [2a03:800:40::10]:1543 and returns a sockaddr_storage +#else * Takes a string of format 00000000:0000 and returns a sockaddr_in. +#endif */ void hex_inadport(s, sad) char *s; +#ifdef IPv6 + struct sockaddr_storage *sad; +{ + struct addrinfo hints,*res; + char hostname[INET6_ADDRSTRLEN]; + char *aux; + memset(hostname,0,INET6_ADDRSTRLEN); + strncpy(hostname,s+1,INET6_ADDRSTRLEN); // Get the numeric part + aux = strchr(hostname,']'); + *aux = '\0'; + + s = (s = CINDEX(s, ']')) ? s + 2 : ""; + memset(&hints,0,sizeof(struct addrinfo)); + hints.ai_family = PF_INET6; /* O UNSPEC ? */ + hints.ai_socktype = SOCK_DGRAM; + getaddrinfo(hostname,s,&hints,&res); + memcpy(sad,res->ai_addr,res->ai_addrlen); + freeaddrinfo(res); +} +#else struct sockaddr_in *sad; { sad->sin_addr.s_addr = htonl((unsigned)pvmxtoi(s)); s = (s = CINDEX(s, ':')) ? s + 1 : ""; sad->sin_port = htons((unsigned short)pvmxtoi(s)); } - +#endif /* inadport_decimal() * +#ifdef IPv6 +* Kept the name for historical reasons. Should be rather in6adport_hex() +* +* Note that is the same as inadport_hex(), since on IPv6 dott address hex charater +* are mandatory 2004:034f:bba0:0001:f456:b345::1 +* +* Returns printable string corr. to sockaddr_storage with addr in decimal. +#else * Returns printable string corr. to sockaddr_in with addr in decimal. +#endif */ char * inadport_decimal(sad) +#ifdef IPv6 + struct sockaddr_storage *sad; +{ + static char buf[INET6_ADDRSTRLEN]; + char host[INET6_ADDRSTRLEN]; + char service[32]; + memset(buf,INET6_ADDRSTRLEN,0); + + getnameinfo((const struct sockaddr *)sad,sa_len(sad),host,INET6_ADDRSTRLEN,service,30,NI_NUMERICHOST|NI_NUMERICSERV); + sprintf(buf,"[%s]:%s",host,service); + return buf; +} +#else struct sockaddr_in *sad; { static char buf[32]; @@ -695,15 +768,34 @@ 0xffff & (int)ntohs(sad->sin_port)); return buf; } +#endif /* inadport_hex() * +#ifdef IPv6 +* Kept the name for historical reasons. Should be rather in6adport_hex() +* Returns printable string corr. to sockaddr_storage with addr in hex. +#else * Returns printable string corr. to sockaddr_in with addr in hex. +#endif */ char * inadport_hex(sad) +#ifdef IPv6 + struct sockaddr_storage *sad; +{ + static char buf[INET6_ADDRSTRLEN+3+30]; /* 3 are for "[]:" and 30 for service */ + char host[INET6_ADDRSTRLEN]; + char service[30]; + memset(buf,INET6_ADDRSTRLEN+3+30,0); + + getnameinfo((const struct sockaddr *)sad,sa_len(sad),host,INET6_ADDRSTRLEN,service,30,NI_NUMERICHOST|NI_NUMERICSERV); + sprintf(buf,"[%s]:%s",host,service); + return buf; +} +#else struct sockaddr_in *sad; { static char buf[16]; @@ -713,6 +805,98 @@ sprintf(buf, "%08x:%04x", a, 0xffff & (int)ntohs(sad->sin_port)); return buf; } +#endif + + +/* + * The next operations are rather abstract and expensive + * (getaddrinfo(),getnameinfo()...) + * + * but they are the only way + * to deal with IPv6 sockaddr_storage API (see below) + * On IPv4 we could use the straigth hack + * + * s_addr = (int) htonl(0x7f000001) + * since sizeof(int)=4 + * + * but there is no integer type holding 16 bytes (128 bits) + * + * In fact: + * + * char[16] s6_addr; + * + * + * Same for services, since they are dealed on char* + * + * TODO: (2004-07-21) + * Alternative should be comparing byte-byte both sin6_addr + * but, this make a warning when casting from struct sockaddr_storage + * to struct sockaddr_in6, not always portable. + */ + +/* 0 is NOT loopback + * <> it is + * + */ +int pvmisloopback(a) + struct sockaddr_storage *a; +{ + char hosta[INET6_ADDRSTRLEN]; + BZERO(hosta,INET6_ADDRSTRLEN); + getnameinfo((const struct sockaddr *)a,sa_len(a),hosta,INET6_ADDRSTRLEN,NULL,0,NI_NUMERICHOST); + return ((strlen(hosta)==3) && !BCMP(hosta,"::1",3)); /* It is not either ::1345:200... or ::2 */ +} + + +/* + * 0 if node(a) == node (b) + * <> 0 other whise + */ +int +pvmcomparein6addr(a,b) + struct sockaddr_storage *a,*b; +{ + char hosta[INET6_ADDRSTRLEN]; + char hostb[INET6_ADDRSTRLEN]; + BZERO(hosta,INET6_ADDRSTRLEN); + BZERO(hostb,INET6_ADDRSTRLEN); + getnameinfo((const struct sockaddr *)a,sa_len(a),hosta,INET6_ADDRSTRLEN,NULL,0,NI_NUMERICHOST); + getnameinfo((const struct sockaddr *)b,sa_len(b),hostb,INET6_ADDRSTRLEN,NULL,0,NI_NUMERICHOST); + return BCMP(hosta,hostb,INET6_ADDRSTRLEN); +} + +/* + * 0 if service(a) == service (b) + * <> 0 other whise + */ +int +pvmcompareport(a,b) + struct sockaddr_storage *a,*b; +{ + char servicea[30]; + char serviceb[30]; + BZERO(servicea,30); + BZERO(serviceb,30); + getnameinfo((const struct sockaddr *)a,sa_len(a),NULL,0,servicea,30,NI_NUMERICSERV); + getnameinfo((const struct sockaddr *)b,sa_len(b),NULL,0,serviceb,30,NI_NUMERICSERV); + return BCMP(servicea,serviceb,30); +} + +/* + * 0 if (node(a),service(a)) == (node (b), service(b)) + * <> 0 other whise + */ +int +pvmcomparesockaddr(a,b) + struct sockaddr_storage *a,*b; +{ + return ( pvmcompareport(a,b) || pvmcomparein6addr(a,b)); + +} + + +#endif /* IPv6 */ + #endif /*I860_NODE*/ diff -ruN pvm3.ori/src/pvmd.c pvm3/src/pvmd.c --- pvm3.ori/src/pvmd.c 2001-09-28 14:43:18.000000000 +0200 +++ pvm3/src/pvmd.c 2004-07-21 19:12:13.000000000 +0200 @@ -724,13 +724,21 @@ char *getenv(); char *inadport_decimal(); char *inadport_hex(); +#ifdef IPv6 +size_t sa_len(struct sockaddr_storage *); /* from pvmcruft.c extern ? */ +#endif + void pvmbailout(); char *pvmdsockfile(); char *pvmgethome(); char *pvmgetroot(); void reap(); void i_dump(); +#ifdef IPv6 +void hex_inadport __ProtoGlarp__ (( char *, struct sockaddr_storage * )); +#else void hex_inadport __ProtoGlarp__ (( char *, struct sockaddr_in * )); +#endif void mesg_rewind __ProtoGlarp__ (( struct pmsg * )); void locl_spawn(); /* void make_valid(char *n); sls */ @@ -1420,8 +1428,13 @@ pvmput16(dummy + 8, 0); pvmput16(dummy + 10, 0); pvmput8(dummy + 12, FFFIN|FFACK); +#ifdef IPv6 + sendto(netsock, dummy, DDFRAGHDR, 0, + (struct sockaddr*)&hp->hd_sad, sa_len(&hp->hd_sad)); +#else sendto(netsock, dummy, DDFRAGHDR, 0, (struct sockaddr*)&hp->hd_sad, sizeof(hp->hd_sad)); +#endif } } @@ -1706,7 +1719,11 @@ #else int oslen; #endif +#ifdef IPv6 + struct sockaddr_storage osad; +#else struct sockaddr_in osad; +#endif struct timeval t; char buf[DDFRAGHDR]; @@ -1727,9 +1744,15 @@ #endif &t); if (cc == 1) { +#ifdef IPv6 + oslen = sa_len(&osad); + recvfrom(ppnetsock, buf, sizeof(buf), + 0, (struct sockaddr*)&osad, &oslen); +#else oslen = sizeof(osad); recvfrom(ppnetsock, buf, sizeof(buf), 0, (struct sockaddr*)&osad, &oslen); +#endif } else if (cc != -1 || errno != EINTR) break; @@ -2201,7 +2224,11 @@ } else #endif if ((cc = sendto(netsock, cp, len, 0, +#ifdef IPv6 + (struct sockaddr*)&hp->hd_sad, sa_len(&hp->hd_sad))) == -1 +#else (struct sockaddr*)&hp->hd_sad, sizeof(hp->hd_sad))) == -1 +#endif && errno != EINTR #ifndef WIN32 && errno != ENOBUFS @@ -2292,7 +2319,12 @@ int netinput() { +#ifdef IPv6 + struct sockaddr_storage osad; /* sender's ip addr */ + /* XXX: Remember, we will use only IPv6 address */ +#else struct sockaddr_in osad; /* sender's ip addr */ +#endif #ifdef SOCKLENISUINT #ifdef IMA_AIX4SP2 unsigned int oslen; @@ -2324,7 +2356,11 @@ if (TDFRAGHDR > DDFRAGHDR) pp->pk_dat += TDFRAGHDR - DDFRAGHDR; +#ifdef IPv6 + oslen = sa_len(&osad); +#else oslen = sizeof(osad); +#endif if ((pp->pk_len = recvfrom(netsock, pp->pk_dat, pp->pk_max - (pp->pk_dat - pp->pk_buf), 0, (struct sockaddr*)&osad, &oslen)) == -1) { @@ -2373,8 +2409,12 @@ * make sure it's from where it claims */ + hh = (src & tidhmask) >> (ffs(tidhmask) - 1); if (hh < 0 || hh > hosts->ht_last || !(hp = hosts->ht_hosts[hh]) +#ifdef IPv6 + || pvmcomparesockaddr(&osad,&hp->hd_sad) /* <>0 diferent */ +#else /* #ifndef IMA_LINUX */ /* appears to be O.K. now in RedHat 5.0... JAK 1/28/98 */ /* @@ -2384,6 +2424,8 @@ || (osad.sin_addr.s_addr != hp->hd_sad.sin_addr.s_addr) || (osad.sin_port != hp->hd_sad.sin_port) /* #endif */ +#endif + ) { pvmlogprintf("netinput() bogus pkt from %s\n", inadport_decimal(&osad)); @@ -2799,7 +2841,11 @@ #ifdef NOUNIXDOM tp->t_salen = sizeof(tp->t_sad); +#ifdef IPv6 + oslen = sa_len(&tp->t_sad); +#else oslen = sizeof(tp->t_sad); +#endif if ((tp->t_sock = accept(loclsock, (struct sockaddr*)&tp->t_sad, &oslen)) == -1) { pvmlogperror("loclconn() accept"); @@ -4702,7 +4748,12 @@ { struct hostd *hp = hosts->ht_hosts[hosts->ht_local]; struct hostd *hp0 = hosts->ht_hosts[0]; +#ifdef IPv6 + struct sockaddr_storage sa; + struct addrinfo hints,*res; +#else struct sockaddr_in sin; +#endif char buf[128]; char *sfn; #ifndef WIN32 @@ -4737,19 +4788,32 @@ * make pvmd-pvmd socket */ +#ifdef IPv6 + if ((netsock = socket(AF_INET6, SOCK_DGRAM, 0)) == -1) { +#else if ((netsock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { +#endif pvmlogperror("mksocs() socket netsock"); return 1; } +#ifdef IPv6 + /* The hp->hd_sad as already been filled */ + if (bind(netsock, (struct sockaddr*)&hp->hd_sad, sa_len(&hp->hd_sad)) == -1) +#else hp->hd_sad.sin_port = 0; oslen = sizeof(hp->hd_sad); if (bind(netsock, (struct sockaddr*)&hp->hd_sad, oslen) == -1) +#endif { pvmlogperror("mksocs() bind netsock"); return 1; } +#ifdef IPv6 + oslen = sa_len(&hp->hd_sad); +#else oslen = sizeof(hp->hd_sad); +#endif if (getsockname(netsock, (struct sockaddr*)&hp->hd_sad, &oslen) == -1) { pvmlogperror("mksocs() getsockname netsock"); return 1; @@ -4759,18 +4823,30 @@ * make pvmd-pvmd' socket */ +#ifdef IPv6 + if ((ppnetsock = socket(AF_INET6, SOCK_DGRAM, 0)) == -1) { +#else if ((ppnetsock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { +#endif pvmlogperror("mksocs() socket ppnetsock"); return 1; } +#ifdef IPv6 + if (bind(ppnetsock, (struct sockaddr*)&hp0->hd_sad, sa_len(&hp0->hd_sad)) == -1) { +#else hp0->hd_sad.sin_port = 0; oslen = sizeof(hp0->hd_sad); if (bind(ppnetsock, (struct sockaddr*)&hp0->hd_sad, oslen) == -1) { +#endif pvmlogperror("mksocs() bind ppnetsock"); return 1; } +#ifdef IPv6 + oslen = sa_len(&hp0->hd_sad); +#else oslen = sizeof(hp0->hd_sad); +#endif if (getsockname(ppnetsock, (struct sockaddr*)&hp0->hd_sad, &oslen) == -1) { pvmlogperror("mksocs() getsockname ppnetsock"); return 1; @@ -4779,8 +4855,64 @@ /* * make pvmd-local task socket */ - #ifdef NOUNIXDOM +#ifdef IPv6 + if ((loclsock = socket(AF_INET6, SOCK_STREAM, 0)) == -1) { + pvmlogperror("mksocs() socket loclsock"); + return 1; + } + + /* + * first try localhost address (loopback) then regular address + * XXX 127.0.0.1 is a hack, we should really gethostbyaddr() + */ + + BZERO((char*)&sa, sizeof(sa)); + memset(&hints,0,sizeof(struct addrinfo)); + hints.ai_family = PF_INET6; + hints.ai_socktype=SOCK_STREAM; + getaddrinfo(NULL,"0",&hints,&res); /* XXX Remember, NULL node means loopback iface, (unless AI_PASSIVE flag stated) */ + BCOPY(res->ai_addr,(char*)&sa,res->ai_addrlen); + freeaddrinfo(res); + + oslen = sa_len(&sa); + if (bind(loclsock, (struct sockaddr*)&sa, oslen) == -1) { + sa = hp->hd_sad; + oslen = sa_len(&sa); + if (bind(loclsock, (struct sockaddr*)&sa, oslen) == -1) { + pvmlogperror("mksocs() bind loclsock"); + return 1; + } + } + oslen = sa_len(&sa); + if (getsockname(loclsock, (struct sockaddr*)&sa, &oslen) == -1) { + pvmlogperror("mksocs() getsockname loclsock"); + return 1; + } + + if (listen(loclsock, SOMAXCONN) == -1) { + pvmlogperror("mksocs() listen loclsock"); + return 1; + } + +#ifndef NOSOCKOPT + bsz = pvmudpmtu * 2; + if (setsockopt(netsock, SOL_SOCKET, SO_SNDBUF, + (char*)&bsz, sizeof(bsz)) == -1 + || setsockopt(netsock, SOL_SOCKET, SO_RCVBUF, + (char*)&bsz, sizeof(bsz)) == -1 + || setsockopt(ppnetsock, SOL_SOCKET, SO_SNDBUF, + (char*)&bsz, sizeof(bsz)) == -1 + || setsockopt(ppnetsock, SOL_SOCKET, SO_RCVBUF, + (char*)&bsz, sizeof(bsz)) == -1) { + pvmlogperror("mksocs() setsockopt"); + return 1; + } +#endif /*NOSOCKOPT*/ + p = inadport_hex(&sa); + + +#else /* IPv6 */ if ((loclsock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { pvmlogperror("mksocs() socket loclsock"); return 1; @@ -4794,7 +4926,7 @@ BZERO((char*)&sin, sizeof(sin)); #if defined(IMA_SP2MPI) || defined(IMA_AIX4SP2) sin = hp->hd_sad; /* allow task to connect from a node */ -#else +#else /* IMA_SP2MPI || IMA_AIX4SP2 */ #ifdef IMA_BEOLIN /* allow connection from another node */ @@ -4814,13 +4946,13 @@ } } sin.sin_port = 0; -#else +#else /* IMA_BEOLIN */ sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(0x7f000001); sin.sin_port = 0; -#endif +#endif /* IMA_BEOLIN */ -#endif +#endif /* IMA_SP2MPI || IMA_AIX4SP2 */ oslen = sizeof(sin); if (bind(loclsock, (struct sockaddr*)&sin, oslen) == -1) { @@ -4856,9 +4988,8 @@ return 1; } #endif /*NOSOCKOPT*/ - p = inadport_hex(&sin); - +#endif /* IPv6 */ #else /*NOUNIXDOM*/ if ((loclsock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { pvmlogperror("mksocs() socket loclsock"); @@ -5150,7 +5281,11 @@ int argc; char **argv; { +#ifdef IPv6 + struct addrinfo hints,*res; +#else struct hostent *he; +#endif struct hostd *hp; struct hostd *hp2; int i; @@ -5201,7 +5336,7 @@ * get attributes from host file if available */ - hp = hosts->ht_hosts[1]; + hp = hosts->ht_hosts[1]; /* i.e, the main pvmd */ if (filehosts && ((hp2 = nametohost(filehosts, hp->hd_name)) || (hp2 = filehosts->ht_hosts[0]))) { @@ -5229,6 +5364,22 @@ pvmlogperror(s); PVM_FREE(s); +#ifdef IPv6 + memset(&hints,0,sizeof(struct addrinfo)); + hints.ai_family = PF_INET6; + hints.ai_socktype = SOCK_DGRAM; + if (getaddrinfo(hp->hd_aname? hp->hd_aname: hp->hd_name,"0",&hints,&res)) { + pvmlogprintf("master_config() %s: can't getaddrinfo\n", hn); + pvmbailout(0); + } + + BCOPY(res->ai_addr, (char*)&hp->hd_sad, + res->ai_addrlen); + hp = hosts->ht_hosts[0]; /* i.e, the pvmd' */ + BCOPY(res->ai_addr, (char*)&hp->hd_sad, + res->ai_addrlen); + freeaddrinfo(res); +#else if (!(he = gethostbyname(hp->hd_aname ? hp->hd_aname : hp->hd_name))) { pvmlogprintf("master_config() %s: can't gethostbyname\n", hn); pvmbailout(0); @@ -5237,9 +5388,10 @@ BCOPY(he->h_addr_list[0], (char*)&hp->hd_sad.sin_addr, sizeof(struct in_addr)); - hp = hosts->ht_hosts[0]; + hp = hosts->ht_hosts[0]; BCOPY(he->h_addr_list[0], (char*)&hp->hd_sad.sin_addr, sizeof(struct in_addr)); +#endif if (pvmdebmask & (PDMHOST|PDMSTARTUP)) { pvmlogerror("master_config() host table:\n"); @@ -5336,7 +5488,7 @@ hp = hd_new(mh); hp->hd_name = STRALLOC("?"); - hex_inadport(argv[2], &hp->hd_sad); + hex_inadport(argv[2], &hp->hd_sad); hp->hd_mtu = atoi(argv[3]); ht_insert(hosts, hp); hd_unref(hp); diff -ruN pvm3.ori/src/task.h pvm3/src/task.h --- pvm3.ori/src/task.h 2000-06-16 18:27:33.000000000 +0200 +++ pvm3/src/task.h 2004-07-19 20:09:56.000000000 +0200 @@ -122,7 +122,11 @@ int t_flag; /* status */ int t_pid; /* unix pid */ int t_sock; /* t-d tcp socket */ +#ifdef IPv6 + struct sockaddr_storage t_sad; /* addr of sock */ +#else struct sockaddr_in t_sad; /* addr of sock */ +#endif int t_salen; /* addr length */ struct waitc *t_wait; /* wait channel */ struct pkt *t_txq; /* to task */ Binary files pvm3.ori/tracer/LINUX/libpvmtrc.a and pvm3/tracer/LINUX/libpvmtrc.a differ Binary files pvm3.ori/tracer/LINUX/tracer and pvm3/tracer/LINUX/tracer differ Binary files pvm3.ori/tracer/LINUX/trcsort and pvm3/tracer/LINUX/trcsort differ diff -ruN pvm3.ori/tracer/tracer.h pvm3/tracer/tracer.h --- pvm3.ori/tracer/tracer.h 2001-05-11 23:19:43.000000000 +0200 +++ pvm3/tracer/tracer.h 2004-07-08 13:46:49.000000000 +0200 @@ -40,7 +40,7 @@ #include "pvmwin.h" #include #endif -#ifndef IMA_MACOSX +#if !(defined(IMA_MACOSX) || defined(IMA_FREEBSD)) #include #endif #include diff -ruN pvm3.ori/tracer/trclib.h pvm3/tracer/trclib.h --- pvm3.ori/tracer/trclib.h 2001-05-11 23:19:43.000000000 +0200 +++ pvm3/tracer/trclib.h 2004-07-08 13:46:49.000000000 +0200 @@ -34,7 +34,7 @@ #include "pvmwin.h" #endif #include -#ifndef IMA_MACOSX +#if !(defined(IMA_MACOSX) || defined(IMA_FREEBSD)) #include #endif diff -ruN pvm3.ori/tracer/trcsort.c pvm3/tracer/trcsort.c --- pvm3.ori/tracer/trcsort.c 2001-05-11 23:19:44.000000000 +0200 +++ pvm3/tracer/trcsort.c 2004-07-08 13:46:49.000000000 +0200 @@ -31,7 +31,7 @@ #include #include -#ifndef IMA_MACOSX +#if !(defined(IMA_MACOSX) || defined(IMA_FREEBSD)) #include #endif