
/* $Id: pvmproto.h,v 1.16 1998/01/12 21:12:01 pvmsrc Exp $ */

/*
 *         PVM version 3.4:  Parallel Virtual Machine System
 *               University of Tennessee, Knoxville TN.
 *           Oak Ridge National Laboratory, Oak Ridge TN.
 *                   Emory University, Atlanta GA.
 *      Authors:  J. J. Dongarra, G. E. Fagg, M. Fischer
 *          G. A. Geist, J. A. Kohl, R. J. Manchek, P. Mucci,
 *         P. M. Papadopoulos, S. L. Scott, and V. S. Sunderam
 *                   (C) 1997 All Rights Reserved
 *
 *                              NOTICE
 *
 * Permission to use, copy, modify, and distribute this software and
 * its documentation for any purpose and without fee is hereby granted
 * provided that the above copyright notice appear in all copies and
 * that both the copyright notice and this permission notice appear in
 * supporting documentation.
 *
 * Neither the Institutions (Emory University, Oak Ridge National
 * Laboratory, and University of Tennessee) nor the Authors make any
 * representations about the suitability of this software for any
 * purpose.  This software is provided ``as is'' without express or
 * implied warranty.
 *
 * PVM version 3 was funded in part by the U.S. Department of Energy,
 * the National Science Foundation and the State of Tennessee.
 */

/*
 *	pvmproto.h
 *
 *	PVM protocol definitions.
 *
$Log: pvmproto.h,v $
 * Revision 1.16  1998/01/12  21:12:01  pvmsrc
 * Added task output collection op defines.
 * 	- TO_NEW, TO_SPAWN, TO_EOF.
 * (Spanker=kohl)
 *
 * Revision 1.15  1997/10/22  22:08:16  pvmsrc
 * Added SYSCTX_DG constant for dynamic group context.
 * (Spanker=kohl)
 *
 * Revision 1.14  1997/10/01  15:34:49  pvmsrc
 * Fixed TM_LAST decl.
 * 	- should be same as last entry, not last + 1...
 * (Spanker=kohl)
 *
 * Revision 1.13  1997/07/09  13:29:37  pvmsrc
 * Fixed Author Header.
 *
 * Revision 1.12  1997/06/10  16:38:55  pvmsrc
 * Minor text cleanup.
 *
 * Revision 1.11  1997/05/29  15:15:05  pvmsrc
 * Fixed decl of SM_FIRST:
 * 	- some compilers too stupid to know it's an (int)0x80040001...
 * 	- D-Oh.
 *
 * Revision 1.10  1997/05/27  14:40:58  pvmsrc
 * Added new TM message:
 * 	TM_SHMCONN. This allows socket and shmem task structs to be merged.
 * 	Also when exchanged sets new TF flag TF_SHMCONN.
 *
 * Revision 1.9  1997/04/09  14:37:17  pvmsrc
 * PVM patches from the base 3.3.10 to 3.3.11 versions where applicable.
 * Originals by Bob Manchek. Altered by Graham Fagg where required.
 *
 * Revision 1.8  1997/04/08  19:18:11  pvmsrc
 * Damn.  Added matching DM_RESETACK constant...  :-Q
 *
 * Revision 1.7  1997/04/08  19:05:51  pvmsrc
 * Added DM_RESET constant.
 * 	- for reset of system, cleanup of persistent message mboxes.
 *
 * Revision 1.6  1997/04/07  18:20:15  pvmsrc
 * Added TMDB_RESET constant.
 * 	- for resetting mbox db on pvmreset()...
 *
 * Revision 1.5  1997/04/04  15:45:03  pvmsrc
 * Typos CTXT -> CTX for consistency. Affects task.c, too
 *
 * Revision 1.4  1997/04/03  19:15:52  pvmsrc
 * Added some system defined contexts for use by TM, TC messages
 *
 * Revision 1.3  1997/04/03  16:12:38  pvmsrc
 * Added correct macro for sequence number wrap-around comparison.
 * This is on SEQLESSTHAN and is useful for 16 bit sequence numbers
 *
 * Revision 1.2  1997/01/28  19:14:22  pvmsrc
 * New Copyright Notice & Authors.
 *
 * Revision 1.1  1996/10/25  13:43:38  pvmsrc
 * Initial revision
 *
 *
 */

#ifndef	_PVMPROTO_H_

#define	_PVMPROTO_H_

/* protocol version */

#ifndef	SDPROTOCOL
#define	SDPROTOCOL	4302
#endif

/*
*	t - task
*	d - pvmd
*	R - resource manager
*	H - hoster
*	T - tasker
*/

#define	SM_FIRST		(int)0x80040001	/* first SM_ message */
#define	SM_SPAWN		(SM_FIRST+0)	/* t<>R like TM_SPAWN */
#define	SM_EXEC			(SM_FIRST+1)	/* R->d like DM_EXEC */
#define	SM_EXECACK		(SM_FIRST+2)	/* d->R like DM_EXECACK */
#define	SM_TASK			(SM_FIRST+3)	/* t<>R like TM_TASK */
#define	SM_CONFIG		(SM_FIRST+4)	/* t<>R like TM_CONFIG */
#define	SM_ADDHOST		(SM_FIRST+5)	/* t<>R like TM_ADDHOST */
#define	SM_DELHOST		(SM_FIRST+6)	/* t<>R like TM_DELHOST */
#define	SM_ADD			(SM_FIRST+7)	/* R->d like DM_ADD */
#define	SM_ADDACK		(SM_FIRST+8)	/* d->R like DM_ADDACK */
#define	SM_NOTIFY		(SM_FIRST+9)	/* t->R like TM_NOTIFY */
#define	SM_TASKX		(SM_FIRST+10)	/* d->R notify of task exit */
#define	SM_HOSTX		(SM_FIRST+11)	/* d->R notify sched of host delete */
#define	SM_HANDOFF		(SM_FIRST+12)	/* R->d pvmd to new sched */
#define	SM_SCHED		(SM_FIRST+13)	/* t<>R like TM_SCHED */
#define	SM_STHOST		(SM_FIRST+14)	/* d->H start slave pvmds */
#define	SM_STHOSTACK	(SM_FIRST+15)	/* H->d like DM_STARTACK */
#define	SM_STTASK		(SM_FIRST+16)	/* d->T start task */
#define	SM_LAST			(SM_FIRST+16)	/* last SM_ message */


/*
 *	ddpro.h
 *
 *	Pvmd-pvmd protocol
 *
 * Revision 1.5  1996/05/13  20:24:06  manchek
 * [GEF pvm3.3.10to11 patch updates]
 * added PVMDISTASK
 *
 * Revision 1.4  1995/05/17  16:06:18  manchek
 * cast DM_FIRST to int.
 * added debugging classes
 *
 * Revision 1.3  1994/07/18  19:19:27  manchek
 * added PDMWAITC
 *
 * Revision 1.2  1994/06/03  20:38:13  manchek
 * version 3.3.0
 *
 * Revision 1.1  1993/08/30  23:26:47  manchek
 * Initial revision
 *
 */


/* protocol version */

#ifndef	DDPROTOCOL
#define	DDPROTOCOL	2316
#endif

#define	DDMINRETRIES	10
#define	DDMAXRTT		9		/* seconds */
#define	DDMINTIMEOUT	(DDMINRETRIES*DDMAXRTT*2)	/* seconds */
#define	DDERRRETRY		300000	/* uSec */
#define	DDPINGTIME		60		/* (sec) between keepalive pings */
#define	DDBAILTIME		300		/* (sec) for new slave to bail if no config */

#define	NEXTSEQNUM(x)		(((x)+1)&0xffff)
#define	SEQNUMCOMPARE(x,y)	((x)<(y)||(((x)>0x8000)&&((y)<0x8000)))
#define	SEQLESSTHAN(x,y)( ((x)<(y) && (y)-(x) <  32768) ||\
					((x)>(y) && (x)-(y) >= 32768) )


/*DocThis*/
/*
 * Pvmd-pvmd packet header
 *
 *    0               1               2               3
 *   +---------------------------------------------------------------+
 *  0|                              dst                              |
 *   +---------------------------------------------------------------+
 *  4|                              src                              |
 *   +-------------------------------+-------------------------------+
 *  8|             seq               |              ack              |
 *   +---------------+---------------+-------------------------------+
 * 12|     flags     |                                               |
 *   +---------------+-----------------------------------------------+
 */
/*EndDocThis*/

#define	DDFRAGHDR		16

/* frag flags */

#define	FFDAT			4		/* packet contains data, seq num is valid */
#define	FFFIN			8		/* sender closing connection */
#define	FFACK			16		/* ack num is valid */

/* d-d message flavors */

#define	DM_FIRST		(int)0x80020001	/* first DM_ message */
#define	DM_ADD			(DM_FIRST+0)	/* add hosts to machine */
#define	DM_ADDACK		(DM_FIRST+1)
#define	DM_EXEC			(DM_FIRST+2)	/* start tasks */
#define	DM_EXECACK		(DM_FIRST+3)
#define	DM_SENDSIG		(DM_FIRST+4)	/* signal a task */
#define	DM_HTUPD		(DM_FIRST+5)	/* define new host table */
#define	DM_HTUPDACK		(DM_FIRST+6)
#define	DM_HTCOMMIT		(DM_FIRST+7)	/* switch to new host table */
#define	DM_SLCONF		(DM_FIRST+8)	/* config slave pvmd */
#define	DM_STARTACK		(DM_FIRST+9)	/* pvmd' completed slave startup */
#define	DM_TASK			(DM_FIRST+10)	/* get list of tasks */
#define	DM_TASKACK		(DM_FIRST+11)
#define	DM_DELHOST		(DM_FIRST+12)	/* delete hosts from machine */
#define	DM_DELHOSTACK	(DM_FIRST+13)
#define	DM_NULL			(DM_FIRST+14)	/* null message */
#define	DM_TASKOUT		(DM_FIRST+15)	/* task standard out/err data */
#define	DM_PSTAT		(DM_FIRST+16)	/* query status of task */
#define	DM_PSTATACK		(DM_FIRST+17)
#define	DM_HALT			(DM_FIRST+18)	/* request master pvmd to halt */
#define	DM_MCA			(DM_FIRST+19)	/* define multicast tid */
#define	DM_NOTIFY		(DM_FIRST+20)	/* request notify */
#define	DM_NOTIFYACK	(DM_FIRST+21)
#define	DM_DB			(DM_FIRST+22)	/* message-mailbox request */
#define	DM_DBACK		(DM_FIRST+23)
#define	DM_RESET		(DM_FIRST+24)	/* reset linkage (mbox tidy) */
#define	DM_RESETACK		(DM_FIRST+25)
#define	DM_HTDEL		(DM_FIRST+26)	/* delete hosts from host table */
#define	DM_HOSTSYNC		(DM_FIRST+27)	/* request clock sample */
#define	DM_HOSTSYNCACK	(DM_FIRST+28)
#define	DM_LAST			(DM_FIRST+28)	/* last DM_ message */

/* DM_SLCONF fields - don't use 0 */

#define	DM_SLCONF_EP	1		/* set epath */
#define	DM_SLCONF_BP	2		/* set bpath */
#define	DM_SLCONF_WD	3		/* set wdir */
#define	DM_SLCONF_SCHED	4		/* set scheduler tid */
#define	DM_SLCONF_TRACE	5		/* set tracer info */

/* pvmd run states */

#define	PVMDNORMAL		1		/* normal running state */
#define	PVMDHTUPD		2		/* getting host table update */
#define	PVMDSTARTUP		3		/* slave just started, not fully configured */
#define	PVMDPRIME		4		/* am pvmd' */
#define	PVMDHALTING		5		/* stopping rsn */
#define	PVMDSHUTDOWN	6		/* in timeout to halt, waiting for FIN|ACK */
#define	PVMDISTASK		7		/* between fork and exec to spawn task */

/* used to cache multicast addresses */

struct mca {
	struct mca *mc_link;	/* dll of peers */
	struct mca *mc_rlink;
	int mc_tid;				/* the multicast tid */
	int mc_ndst;			/* number of dsts */
	int *mc_dsts;			/* dst tids (local tasks or foreign pvmds) */
};

struct mca *mca_new __ProtoGlarp__(( void ));
void mca_free __ProtoGlarp__((struct mca *mcap));
struct pmsg *mesg_new __ProtoGlarp__(( int master ));


/*
 *	tdpro.h
 *
 *	Task-pvmd protocol
 *
 * Revision 1.5  1995/06/28  15:32:29  manchek
 * added TC_SHMAT
 *
 * Revision 1.4  1995/05/17  16:56:06  manchek
 * added support for CSPP subcomplexes (/tmp file naming).
 * case TM_FIRST, TC_FIRST to int
 * add TM_GETOPT message
 *
 * Revision 1.3  1994/06/03  20:38:31  manchek
 * version 3.3.0
 *
 * Revision 1.2  1993/10/04  20:30:50  manchek
 * added alternate TDSOCKNAME if SHAREDTMP is defined
 *
 * Revision 1.1  1993/08/30  23:26:52  manchek
 * Initial revision
 *
 */


/* protocol version */

#ifndef	TDPROTOCOL
#define	TDPROTOCOL	1318
#endif

/*DocThis*/
/*
 * Task-task, task-pvmd fragment header
 *
 *    0               1               2               3
 *   +---------------------------------------------------------------+
 *  0|                              dst                              |
 *   +---------------------------------------------------------------+
 *  4|                              src                              |
 *   +---------------------------------------------------------------+
 *  8|                             length                            |
 *   +---------------+-----------------------------------------------+
 * 12|     flags     |                                               |
 *   +---------------+-----------------------------------------------+
 */
/*EndDocThis*/

#define	TDFRAGHDR	16

/*
* Maximum size of all headers in system
*/

#define	MAXHDR		((DDFRAGHDR > TDFRAGHDR ? DDFRAGHDR : TDFRAGHDR) \
					+ MSGHDRLEN)

/* file with task->pvmd sockaddr */

#ifdef	SHAREDTMP
#define	TDSOCKNAME	"/tmp/pvmd.%d.%s"
#else
#define	TDSOCKNAME	"/tmp/pvmd.%d"
#endif

#ifdef	IMA_CSPP
#ifdef	SHAREDTMP
#define	TDSOCKNAME_CSPP	"/tmp/pvmd.%d.%d.%s"
#else
#define	TDSOCKNAME_CSPP	"/tmp/pvmd.%d.%d"
#endif
#endif	/*IMA_CSPP*/

#define	TM_FIRST	(int)0x80010001	/* first TM_ message */
#define	TM_CONNECT	(TM_FIRST+0)	/* task connects */
#define	TM_CONN2	(TM_FIRST+1)	/* 2nd round of connect */
#define	TM_EXIT		(TM_FIRST+2)	/* task disconnects */
#define	TM_ADDHOST	(TM_FIRST+3)	/* add hosts to machine */
#define	TM_DELHOST	(TM_FIRST+4)	/* delete hosts from machine */
#define	TM_CONFIG	(TM_FIRST+5)	/* get machine config */
#define	TM_MSTAT	(TM_FIRST+6)	/* get host status */
#define	TM_HALT		(TM_FIRST+7)	/* halt machine */
#define	TM_TICKLE	(TM_FIRST+8)	/* tickle pvmd */
#define	TM_SPAWN	(TM_FIRST+9)	/* spawn new tasks */
#define	TM_PSTAT	(TM_FIRST+10)	/* get task status */
#define	TM_SENDSIG	(TM_FIRST+11)	/* signal a task */
#define	TM_TASK		(TM_FIRST+12)	/* list tasks */
#define	TM_MCA		(TM_FIRST+13)	/* request multicast tid */
#define	TM_NOTIFY	(TM_FIRST+14)	/* request notification */
#define	TM_DB		(TM_FIRST+15)	/* message-mailbox request */
#define	TM_SCHED	(TM_FIRST+16)	/* register task as scheduler */
#define	TM_TASKER	(TM_FIRST+17)	/* register task as task starter */
#define	TM_HOSTER	(TM_FIRST+18)	/* register task as pvmd starter */
#define	TM_TRACER	(TM_FIRST+19)	/* register task as task tracer */
#define	TM_HOSTSYNC	(TM_FIRST+20)	/* get clock delta to host */
#define	TM_SETOPT	(TM_FIRST+21)	/* set task parameters */
#define	TM_GETOPT	(TM_FIRST+22)	/* get all task parameters */
#define	TM_CONTEXT	(TM_FIRST+23)	/* allocate or free a context id */
#define	TM_SHMCONN	(TM_FIRST+24)	/* shmem task connect */
#define	TM_LAST		(TM_FIRST+24)	/* last TM_ message */

/*
* for TM_DB
*/

#define	TMDB_PUT	1			/* insert message */
#define	TMDB_REMOVE	2			/* delete entry */
#define	TMDB_GET	3			/* retrieve entry */
#define	TMDB_NAMES	4			/* get list of all names defined */
#define	TMDB_RESET	5			/* wipe out mbox db entries */

/*
* for TM_SETOPT
*/

#define	TS_OUTTID	1				/* stdout dst */
#define	TS_OUTCTX	2				/* stdout message context */
#define	TS_OUTTAG	3				/* stdout message tag */
#define	TS_TRCTID	4				/* trace dst */
#define	TS_TRCCTX	5				/* trace message context */
#define	TS_TRCTAG	6				/* trace message tag */

#define	TC_FIRST		(int)0x80030001	/* first TC_ message */
#define	TC_CONREQ		(TC_FIRST+0)	/* connection request */
#define	TC_CONACK		(TC_FIRST+1)	/* connection request ack */
#define	TC_TASKEXIT		(TC_FIRST+2)	/* task exited/doesn't exist */
#define	TC_NOOP			(TC_FIRST+3)	/* do nothing */
#define	TC_OUTPUT		(TC_FIRST+4)	/* child stdout data */
#define	TC_SETTRACE		(TC_FIRST+5)	/* set task tracing */
#define	TC_SETTMASK		(TC_FIRST+6)	/* set task trace mask */
#define	TC_SETTRCBUF	(TC_FIRST+7)	/* set task trace buffer */
#define	TC_SETTRCOPT	(TC_FIRST+8)	/* set task trace options */
#define	TC_SHMAT		(TC_FIRST+9)	/* shmem connect handshake */
#define	TC_OUTPUTX		(TC_FIRST+10)	/* (not sent) flush out coll */
#define	TC_SIBLINGS		(TC_FIRST+11)	/* parent announce spawn grp */
#define	TC_LAST			(TC_FIRST+11)	/* last TC_ message */

/*
* for Task Output Ops
*/

#define TO_EOF		 0
#define TO_SPAWN	-1
#define TO_NEW		-2


/* Contexts Used by Some System Calls - these are allocated from the
   top of the context space */

#define SYSCTX_FIRST	(int) 0x0007ffff	/* first system context */
#define SYSCTX_TC		(SYSCTX_FIRST-0)	/* ctxt for TC messages */
#define SYSCTX_TM		(SYSCTX_FIRST-1)	/* ctxt for TM messages */
#define SYSCTX_SG		(SYSCTX_FIRST-2) 	/* ctxt for static group formation*/
#define SYSCTX_DG		(SYSCTX_FIRST-3) 	/* ctxt for dynamic groups */
#define SYSCTX_RS4		(SYSCTX_FIRST-4)	/* Reserved system context */
#define SYSCTX_RS5		(SYSCTX_FIRST-5)	/* Reserved system context */
#define SYSCTX_RS6		(SYSCTX_FIRST-6)	/* Reserved system context */
#define SYSCTX_RS7		(SYSCTX_FIRST-7)	/* Reserved system context */
#define SYSCTX_RS8		(SYSCTX_FIRST-8)	/* Reserved system context */
#define SYSCTX_RS9		(SYSCTX_FIRST-9)	/* Reserved system context */
#define SYSCTX_LAST		(SYSCTX_FIRST-9)
#define NUM_SYSCTX		(SYSCTX_FIRST-SYSCTX_LAST+1)			

#define BASECONTEXT		(int) 0

#endif	/*_PVMPROTO_H_*/

