/*
 * Copyright (c) 2001-2004 The Trustees of Indiana University.  
 *                         All rights reserved.
 * Copyright (c) 1998-2001 University of Notre Dame. 
 *                         All rights reserved.
 * Copyright (c) 1994-1998 The Ohio State University.  
 *                         All rights reserved.
 * 
 * This file is part of the LAM/MPI software package.  For license
 * information, see the LICENSE file in the top level directory of the
 * LAM/MPI source distribution.
 * 
 * $HEADER$
 *
 * $Id: lam-ssi-boot.h,v 1.8 2004/03/06 21:17:31 jsquyres Exp $
 *
 * Interface for the boot module for the LAM/MPI SSI project.
 */

#ifndef LAM_SSI_BOOT_H
#define LAM_SSI_BOOT_H


#include <lam_config.h>

#include <lam-ssi.h>
#include <lamnet.h>
#include <all_opt.h>
#include <all_list.h>


/*
 * Global functions for SSI overall boot open and close
 */

typedef enum {
  LAM_SSI_BOOT_LOCATION_ROOT,
  LAM_SSI_BOOT_LOCATION_INTERIOR,
  LAM_SSI_BOOT_LOCATION_LEAF,

  LAM_SSI_BOOT_LOCATION_MAX
} lam_ssi_boot_location_t;


#if defined(c_plusplus) || defined(__cplusplus)
extern "C" {
#endif
  int lam_ssi_boot_open(OPT *aod);
  int lam_ssi_boot_select(lam_ssi_boot_location_t where);
  int lam_ssi_boot_close(void);
#if defined(c_plusplus) || defined(__cplusplus)
}
#endif


/***********************************************************************
 *
 * Initialization / finalization
 *
 * Setup the module and decide if it will run or not.
 *
 **********************************************************************/

typedef const struct lam_ssi_boot_actions_1_1_0 *
  (*lam_ssi_boot_init_fn_t)(lam_ssi_boot_location_t where, int *priority);
typedef int (*lam_ssi_boot_finalize_fn_t)(void);


/***********************************************************************
 *
 * User interface
 *
 * What lamboot and others call directly.  See the SSI boot docs for
 * descriptions of these functions.
 *
 **********************************************************************/

typedef enum {
  LAM_SSI_BOOT_PROC_LAMD,
  LAM_SSI_BOOT_PROC_RECON,
  LAM_SSI_BOOT_PROC_WIPE,

  LAM_SSI_BOOT_PROC_MAX
} lam_ssi_boot_proc_t;

typedef int (*lam_ssi_boot_parse_options_fn_t)(OPT *aod, int boot_schema_args);
typedef int (*lam_ssi_boot_allocate_nodes_fn_t)
     (struct lamnode **nodes, int *nnodes, int *origin);
typedef int (*lam_ssi_boot_verify_nodes_fn_t)
     (struct lamnode *nodes, int nnodes);
typedef int (*lam_ssi_boot_prepare_boot_fn_t)(void);
typedef int (*lam_ssi_boot_start_rte_procs_fn_t)
     (struct lamnode *nodes, int nnodes, lam_ssi_boot_proc_t which,
      int *num_started);
typedef int (*lam_ssi_boot_deallocate_nodes_fn_t)
     (struct lamnode **nodes, int *nnodes);


/***********************************************************************
 *
 * Internal interface
 *
 * Things that should never be called outside of the boot SSI modules.
 * These functions are mainly used by the booting algorithms.
 *
 **********************************************************************/

typedef int (*lam_ssi_boot_start_application_fn_t)
     (char ***argv, int *argc, int num_procs, struct lamnode *node);
typedef int (*lam_ssi_boot_start_rte_proc_fn_t)
     (struct lamnode *node, lam_ssi_boot_proc_t which);


/***********************************************************************
 *
 * Startup protocol interface
 *
 * Mainly for starting lamds.  Send information about the
 * newly-started lamd, and receive information about the universe.
 *
 **********************************************************************/

typedef int (*lam_ssi_boot_get_nodeid_fn_t)(OPT *aod);
typedef int (*lam_ssi_boot_open_srv_connection_fn_t)
     (struct lamnode *nodes, int nnodes);
typedef int (*lam_ssi_boot_send_lamd_info_fn_t)(OPT *aod, int dli_port);
typedef int (*lam_ssi_boot_receive_lamd_info_fn_t)
     (struct lamnode *nodes, int nnodes);
typedef int (*lam_ssi_boot_close_srv_connection_fn_t)(void);
typedef int (*lam_ssi_boot_send_universe_info_fn_t)
     (struct lamnode *nodes, int nnodes, int which);
typedef int (*lam_ssi_boot_receive_universe_info_t)
     (struct lamnode **universe, int *universe_size);

/***********************************************************************
 *
 * End of API function typedefs
 *
 **********************************************************************/


/*
 * Algorithm functions provided to all boot SSI modules
 */

typedef int (*lam_ssi_boot_alg_fn_t)
     (struct lamnode *nodes, int nnodes, int want_startup_protocol,
      lam_ssi_boot_proc_t which, int *num_started);

int lam_ssi_boot_base_alg_linear(struct lamnode *nodes, int nnodes, 
				 int want_startup_protocol,
				 lam_ssi_boot_proc_t which,
				 int *num_started);
int lam_ssi_boot_base_alg_linear_windowed(struct lamnode *nodes, int nnodes, 
                                          int want_startup_protocol,
                                          lam_ssi_boot_proc_t which,
                                          int *num_started);
int lam_ssi_boot_base_alg_thread(struct lamnode *nodes, int nnodes, 
				 int want_startup_protocol,
				 lam_ssi_boot_proc_t which,
				 int *num_started);
int lam_ssi_boot_base_alg_tree(struct lamnode *nodes, int nnodes, 
			       int want_startup_protocol,
			       lam_ssi_boot_proc_t which,
			       int *num_started);


/* 
 * Startup protocol functions based on TCP sockets; any boot SSI
 * module can use these
 */

int lam_ssi_boot_base_get_nodeid(OPT *aod);
int lam_ssi_boot_base_open_srv_connection(struct lamnode *nodes, int nnodes);
int lam_ssi_boot_base_send_lamd_info(OPT *aod, int dli_port);
int lam_ssi_boot_base_send_lamd_info_args(OPT *aod,
                                          unsigned char agent_haddr[4],
                                          int agent_port, int node_id, 
                                          int dli_port, int num_cpus);
int lam_ssi_boot_base_receive_lamd_info(struct lamnode *nodes, int nnodes);
int lam_ssi_boot_base_close_srv_connection(void);

int lam_ssi_boot_base_send_universe_info(struct lamnode *nodes,
					 int nnodes, int which);
int lam_ssi_boot_base_receive_universe_info(struct lamnode **universe,
					    int *universe_size);


/*
 * Utiltity functions for use in boot SSI modules
 */

int lam_ssi_boot_base_append_path(char *prefix, char *dir, char *fname,
				  int *argcnt, char ***arglist);

char *lam_ssi_boot_base_find_boot_schema(OPT *aod);
char *lam_ssi_boot_base_find_hostname(OPT *aod);
char *lam_ssi_boot_base_find_prefix(LIST *keyval);
char *lam_ssi_boot_build_inet_topo(struct lamnode *dest_node, 
				   struct lamnode origin_node,
				   int origin);
int lam_ssi_boot_do_common_args(OPT *aod, int *argc, char ***argv);
int lam_ssi_boot_base_check_priority(char *module_name, int base, 
				     int want_default, int *priority);
int lam_ssi_boot_base_ioexecvp(char **cmdv, int showout, char *outbuff,
			       int outbuffsize, int stderr_is_err);
char *lam_ssi_boot_base_lamgrow(char *hostname, struct lamnode **nodes,
                                int *nnodes, int *origin);


/*
 * Struct used to pass boot SSI information from the each SSI instance
 * back to the SSI glue.
 */

typedef struct lam_ssi_boot_1_1_0 {
  lam_ssi_1_0_0_t lsb_meta_info;

  /* Initialize / finalize functions */

  lam_ssi_boot_init_fn_t lsb_init;
  lam_ssi_boot_finalize_fn_t lsb_finalize;
} lam_ssi_boot_1_1_0_t;


typedef struct lam_ssi_boot_actions_1_1_0 {

  /* Boot API function pointers */

  lam_ssi_boot_parse_options_fn_t lsba_parse_options;
  lam_ssi_boot_allocate_nodes_fn_t lsba_allocate_nodes;
  lam_ssi_boot_verify_nodes_fn_t lsba_verify_nodes;
  lam_ssi_boot_prepare_boot_fn_t lsba_prepare_boot;
  lam_ssi_boot_start_rte_procs_fn_t lsba_start_rte_procs;
  lam_ssi_boot_deallocate_nodes_fn_t lsba_deallocate_nodes;

  lam_ssi_boot_start_application_fn_t lsba_start_application;
  lam_ssi_boot_start_rte_proc_fn_t lsba_start_rte_proc;

  lam_ssi_boot_get_nodeid_fn_t lsba_get_nodeid;
  lam_ssi_boot_open_srv_connection_fn_t lsba_open_srv_connection;
  lam_ssi_boot_send_lamd_info_fn_t lsba_send_lamd_info;
  lam_ssi_boot_receive_lamd_info_fn_t lsba_receive_lamd_info;
  lam_ssi_boot_close_srv_connection_fn_t lsba_close_srv_connection;

  lam_ssi_boot_send_universe_info_fn_t lsba_send_universe_info;
  lam_ssi_boot_receive_universe_info_t lsba_receive_universe_info;

} lam_ssi_boot_actions_1_1_0_t;


/*
 * Set the default type to use version 1.1.0 of the SSI boot struct 
 */

typedef lam_ssi_boot_1_1_0_t lam_ssi_boot_t;
typedef lam_ssi_boot_actions_1_1_0_t lam_ssi_boot_actions_t;


/*
 * Global variables
 */

extern int lam_ssi_boot_verbose;
extern int lam_ssi_boot_did;
extern int lam_ssi_boot_base_server_port;
extern lam_ssi_boot_actions_t lam_ssi_boot;
extern lam_ssi_boot_t lam_ssi_boot_base_module;
extern LIST *lam_ssi_boot_base_opened;
extern OPT *lam_ssi_boot_optd;
extern int lam_ssi_boot_base_param_promisc;
extern int lam_ssi_boot_base_param_window_size;


/*
 * Global instance of array of pointers to lam_ssi_boot_t.  Will
 * effectively be filled in by configure.
 */

extern const lam_ssi_t **lam_ssi_boot_modules;


#endif /* #ifndef LAM_SSI_BOOT_H */


syntax highlighted by Code2HTML, v. 0.9.1