OpenSS7
SS7 for the
Common Man

© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved.
Last modified:

Home Overview Status News Documentation Resources About
   
 Overview
 Status
 News
 Documentation
 Resources
 About

   
Home Index Prev Next More Download Info FAQ Mail   Home -> Resources -> Browse Source -> strss7/test/test-m2pa.c


File /code/strss7/test/test-m2pa.c



#ident "@(#) $RCSfile: test-m2pa.c,v $ $Name:  $($Revision: 0.8.2.11 $) $Date: 2003/04/15 02:16:11 $"

static char const ident[] =
    "$RCSfile: test-m2pa.c,v $ $Name:  $($Revision: 0.8.2.11 $) $Date: 2003/04/15 02:16:11 $";

#include <stropts.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/poll.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <features.h>
#include <limits.h>
#include <stdint.h>
#include <sys/types.h>
#include <asm/byteorder.h>

#include <ss7/lmi.h>
#include <ss7/lmi_ioctl.h>
#include <ss7/sdli.h>
#include <ss7/sdli_ioctl.h>
#include <ss7/devi.h>
#include <ss7/devi_ioctl.h>
#include <ss7/sdti.h>
#include <ss7/sdti_ioctl.h>
#include <ss7/sli.h>
#include <ss7/sli_ioctl.h>

#include <sys/npi.h>
#include <sys/npi_sctp.h>

#define SUCCESS		 0
#define FAILURE		 1
#define INCONCLUSIVE	-1
#define NOTAPPLICABLE	-2
#define SCRIPTERROR	-3

#define BUFSIZE 300
#define FFLUSH(_stream)
//#define FFLUSH(_stream)  fflush((_stream))

#define SHORT_WAIT   10
#define NORMAL_WAIT  100
#define LONG_WAIT    500
#define MAXIMUM_WAIT 1000

#ifndef HZ
#define HZ 100
#endif

/*
 *  -------------------------------------------------------------------------
 *
 *  Configuration
 *
 *  -------------------------------------------------------------------------
 */

//#define M2PA_VERSION_DRAFT3
//#define M2PA_VERSION_DRAFT3_1
//#define M2PA_VERSION_DRAFT4
//#define M2PA_VERSION_DRAFT4_1
//#define M2PA_VERSION_DRAFT4_9
//#define M2PA_VERSION_DRAFT5
//#define M2PA_VERSION_DRAFT5_1
//#define M2PA_VERSION_DRAFT6
//#define M2PA_VERSION_DRAFT6_1
#define M2PA_VERSION_DRAFT6_9
//#define M2PA_VERSION_DRAFT7

typedef struct addr {
	uint16_t port __attribute__ ((packed));
	uint32_t addr[3] __attribute__ ((packed));
} addr_t;

static struct {
	addr_t loc;
	addr_t rem;
	N_qos_sel_info_sctp_t qos;
	N_qos_sel_data_sctp_t qos_data;
} ptconf = {
	{
		__constant_htons(10001), {
			__constant_htonl(0x7f000001), __constant_htonl(0x7f000002), __constant_htonl(0x7f000003)
		}
	},			/* loc */
	{
		__constant_htons(10000), {
			__constant_htonl(0x7f000001), __constant_htonl(0x7f000002), __constant_htonl(0x7f000003)
		}
	},			/* rem */
	{
		N_QOS_SEL_INFO_SCTP,	/* n_qos_type */
		    2,		/* i_streams */
		    2,		/* o_streams */
		    5,		/* ppi */
		    0,		/* sid */
		    -1L,	/* max_in */
		    -1L,	/* max_retran */
		    -1L,	/* ck_life */
		    -1L,	/* ck_inc */
		    -1L,	/* hmac */
		    -1L,	/* thrott */
		    -1L,	/* max_sack */
		    -1L,	/* rto_ini */
		    -1L,	/* rto_min */
		    -1L,	/* rto_max */
		    -1L,	/* rtx_path */
		    -1L,	/* hb_itvl */
		    0		/* options */
	}, {
		N_QOS_SEL_DATA_SCTP,	/* n_qos_type */
		    5,		/* ppi */
		    1,		/* sid */
		    0,		/* ssn */
		    0,		/* tsn */
		    0		/* more */
	}
};

static struct {
	addr_t loc;
	addr_t rem;
	N_qos_sel_info_sctp_t qos;
	lmi_option_t opt;
	sdl_config_t sdl;
	sdt_config_t sdt;
	sl_config_t sl;
} iutconf = {
	{
		__constant_htons(10000), {
		__constant_htonl(0x7f000001), __constant_htonl(0x7f000002), __constant_htonl(0x7f000003),}
	},			/* loc */
	{
		__constant_htons(10001), {
		__constant_htonl(0x7f000001), __constant_htonl(0x7f000002), __constant_htonl(0x7f000003),}
	},			/* rem */
	{
		N_QOS_SEL_INFO_SCTP,	/* n_qos_type */
		    2,		/* i_streams */
		    2,		/* o_streams */
		    5,		/* ppi */
		    0,		/* sid */
		    -1L,	/* max_in */
		    -1L,	/* max_retran */
		    -1L,	/* ck_life */
		    -1L,	/* ck_inc */
		    -1L,	/* hmac */
		    -1L,	/* thrott */
		    -1L,	/* max_sack */
		    -1L,	/* rto_ini */
		    -1L,	/* rto_min */
		    -1L,	/* rto_max */
		    -1L,	/* rtx_path */
		    -1L,	/* hb_itvl */
		    0,		/* options */
	},			/* qos */
	{
		SS7_PVAR_ITUT_96,	/* pvar */
		    0,		/* popt */
	},			/* opt */
	{
      ifname: NULL, ifflags: 0, iftype: SDL_TYPE_PACKET, ifrate: 10000000, ifgtype: SDL_GTYPE_SCTP, ifgrate: 10000000, ifmode: SDL_MODE_PEER, ifgmode: SDL_GMODE_NONE, ifgcrc: SDL_GCRC_NONE, ifclock: SDL_CLOCK_NONE, ifcoding: SDL_CODING_NONE, ifframing: SDL_FRAMING_NONE, ifblksize: 0, ifleads: 0, ifbpv: 0, ifalarms: 0, ifrxlevel: 0, iftxlevel: 0, ifsync:0,},
				/* sdl */
	{
	      t8:100 * HZ / 1000,	/* t8 - T8 timeout */
	      Tin: 4,		/* Tin - AERM normal proving threshold */
	      Tie: 1,		/* Tie - AERM emergency proving threshold */
	      T:   64,		/* T - SUERM error threshold */
	      D:   256,	/* D - SUERM error rate parameter */
	      Te:  577169,	/* Te - EIM error threshold */
	      De:  9308000,	/* De - EIM correct decrement */
	      Ue:  144292000,	/* Ue - EIM error increment */
	      N:   16,		/* N */
	      m:   272,	/* m */
	      b:   64,		/* b */
	      f:   1,		/* f */
	},			/* sdt */
	{
	      t1:45 * HZ,	/* t1 - timer t1 duration (ticks) */
	      t2:  5 * HZ,	/* t2 - timer t2 duration (ticks) */
	      t2l: 20 * HZ,	/* t2l - timer t2l duration (ticks) */
	      t2h: 100 * HZ,	/* t2h - timer t2h duration (ticks) */
	      t3:  1 * HZ,	/* t3 - timer t3 duration (ticks) */
	      t4n: 8 * HZ,	/* t4n - timer t4n duration (ticks) */
	      t4e: 500 * HZ / 1000,	/* t4e - timer t4e duration (ticks) */
	      t5:  100 * HZ / 1000,	/* t5 - timer t5 duration (ticks) */
	      t6:  4 * HZ,	/* t6 - timer t6 duration (ticks) */
	      t7:  2 * HZ,	/* t7 - timer t7 duration (ticks) */
	      rb_abate:3,	/* rb_abate - RB cong abatement (#msgs) */
	      rb_accept:6,	/* rb_accept - RB cong onset accept (#msgs) */
	      rb_discard:9,	/* rb_discard - RB cong discard (#msgs) */
	      tb_abate_1:128 * 272,
		    /* tb_abate_1 - lev 1 cong abate (#bytes) */
	      tb_onset_1:256 * 272,
		    /* tb_onset_1 - lev 1 cong onset (#bytes) */
	      tb_discd_1:384 * 272,
		    /* tb_discd_1 - lev 1 cong discard (#bytes) */
	      tb_abate_2:512 * 272,
		    /* tb_abate_2 - lev 1 cong abate (#bytes) */
	      tb_onset_2:640 * 272,
		    /* tb_onset_2 - lev 1 cong onset (#bytes) */
	      tb_discd_2:768 * 272,
		    /* tb_discd_2 - lev 1 cong discard (#bytes) */
	      tb_abate_3:896 * 272,
		    /* tb_abate_3 - lev 1 cong abate (#bytes) */
	      tb_onset_3:1024 * 272,
		    /* tb_onset_3 - lev 1 cong onset (#bytes) */
	      tb_discd_3:1152 * 272,
		    /* tb_discd_3 - lev 1 cong discard (#bytes) */
	      N1:  31,	/* N1 - PCR/RTBmax messages (#msg) */
	      N2:  8192,	/* N2 - PCR/RTBmax octets (#bytes) */
	      M:   5		/* M - IAC normal proving periods */
} /* sl */ };

static struct {
	addr_t loc;
	addr_t rem;
	N_qos_sel_info_sctp_t qos;
} mgmconf = {
	{
		__constant_htons(10001), {
			__constant_htonl(0x7f000001), __constant_htonl(0x7f000002), __constant_htonl(0x7f000003)
		}
	},			/* loc */
	{
		__constant_htons(10000), {
			__constant_htonl(0x7f000001), __constant_htonl(0x7f000002), __constant_htonl(0x7f000003)
		}
	},			/* rem */
	{
		N_QOS_SEL_INFO_SCTP,	/* n_qos_type */
		    2,		/* i_streams */
		    2,		/* o_streams */
		    5,		/* ppi */
		    0,		/* sid */
		    -1L,	/* max_in */
		    -1L,	/* max_retran */
		    -1L,	/* ck_life */
		    -1L,	/* ck_inc */
		    -1L,	/* hmac */
		    -1L,	/* thrott */
		    -1L,	/* max_sack */
		    -1L,	/* rto_ini */
		    -1L,	/* rto_min */
		    -1L,	/* rto_max */
		    -1L,	/* rtx_path */
		    -1L,	/* hb_itvl */
		    0		/* options */
	}			/* qos */
};

/*
 *  -------------------------------------------------------------------------
 *
 *  Timer Functions
 *
 *  -------------------------------------------------------------------------
 */

/*
 *  Timer values for tests: each timer has a low range (minus error margin) and
 *  a high range (plus error margin).
 */

typedef struct timer_range {
	long lo;
	long hi;
	char *name;
} timer_range_t;

enum { t1 = 0, t2, t3, t4n, t4e, t5, t6, t7, tmax };

static timer_range_t timer[tmax] = {
	{40000, 50000, "T1"},	/* Timer T1 30000 */
	{5000, 150000, "T2"},	/* Timer T2 5000 */
	{1000, 1500, "T3"},	/* Timer T3 100 */
	{7500, 9500, "T4(Pn)"},	/* Timer T4n 3000 */
	{400, 600, "T4(Pe)"},	/* Timer T4e 50 */
	{125, 125, "T5"},	/* Timer T5 10 */
	{3000, 6000, "T6"},	/* Timer T6 300 */
	{500, 2000, "T7"}	/* Timer T7 50 */
};

long test_start = 0;

/*
 *  Return the current time in milliseconds.
 */
static long dual_milliseconds(int t1, int t2)
{
	long ret;
	struct timeval now;
	printf("                               !                                    \n");
	printf("                               !  %-6.6s     %ld.%03ld <= %-2.2s <= %ld.%03ld   \n",
	       timer[t1].name, timer[t1].lo / 1000, timer[t1].lo - ((timer[t1].lo / 1000) * 1000),
	       timer[t1].name, timer[t1].hi / 1000, timer[t1].hi - ((timer[t1].hi / 1000) * 1000));
	printf("                               !   +                                \n");
	printf("                               !  %-6.6s     %ld.%03ld <= %-2.2s <= %ld.%03ld   \n",
	       timer[t2].name, timer[t2].lo / 1000, timer[t2].lo - ((timer[t2].lo / 1000) * 1000),
	       timer[t2].name, timer[t2].hi / 1000, timer[t2].hi - ((timer[t2].hi / 1000) * 1000));
	printf("                               !                                    \n");
	FFLUSH(stdout);
	gettimeofday(&now, NULL);
	if (!test_start)	/* avoid blowing over precision */
		test_start = now.tv_sec;
	ret = (now.tv_sec - test_start) * 1000;
	ret += (now.tv_usec + 500L) / 1000;
	return ret;
}

/*
 *  Return the current time in milliseconds.
 */
static long milliseconds(int t)
{
	long ret;
	struct timeval now;
	printf("                               !                                    \n");
	printf("                               !  %-6.6s     %ld.%03ld <= %-2.2s <= %ld.%03ld   \n",
	       timer[t].name, timer[t].lo / 1000, timer[t].lo - ((timer[t].lo / 1000) * 1000),
	       timer[t].name, timer[t].hi / 1000, timer[t].hi - ((timer[t].hi / 1000) * 1000));
	printf("                               !                                    \n");
	FFLUSH(stdout);
	gettimeofday(&now, NULL);
	if (!test_start)	/* avoid blowing over precision */
		test_start = now.tv_sec;
	ret = (now.tv_sec - test_start) * 1000;
	ret += (now.tv_usec + 500L) / 1000;
	return ret;
}

/*
 *  Check the current time against the beginning time provided as an argnument
 *  and see if the time inverval falls between the low and high values for the
 *  timer as specified by arguments.  Return SUCCESS if the interval is within
 *  the allowable range and FAILURE otherwise.
 */
static int check_time(const char *t, long beg, long lo, long hi)
{
	long i;
	struct timeval now;
	if (gettimeofday(&now, NULL)) {
		printf("****ERROR: gettimeofday\n");
		printf("           %s: %s\n", __FUNCTION__, strerror(errno));
		FFLUSH(stdout);
		return FAILURE;
	}
	i = (now.tv_sec - test_start) * 1000;
	i += (now.tv_usec + 500L) / 1000;
	i -= beg;
	printf
	    ("                           check timeout     %s [%ld.%03ld <= %ld.%03ld <= %ld.%03ld]\n",
	     t, (lo - 100) / 1000, (lo - 100) - (((lo - 100) / 1000) * 1000), i / 1000,
	     i - ((i / 1000) * 1000), (hi + 100) / 1000, (hi + 100) - (((hi + 100) / 1000) * 1000)
	    );
	FFLUSH(stdout);
	if (lo - 100 <= i && i <= hi + 100)
		return SUCCESS;
	else
		return FAILURE;
}

static int timer_timeout = 0;

static void timer_handler(int signum)
{
	if (signum == SIGALRM)
		timer_timeout = 1;
	return;
}

static int timer_sethandler(void)
{
	sigset_t mask;
	struct sigaction act;
	act.sa_handler = timer_handler;
	act.sa_flags = SA_RESTART | SA_ONESHOT;
	act.sa_restorer = NULL;
	sigemptyset(&act.sa_mask);
	if (sigaction(SIGALRM, &act, NULL))
		return FAILURE;
	sigemptyset(&mask);
	sigaddset(&mask, SIGALRM);
	sigprocmask(SIG_UNBLOCK, &mask, NULL);
	return SUCCESS;
}

/*
 *  Start an interval timer as the overall test timer.
 */
static int start_tt(long duration)
{
	struct itimerval setting = {
		{0, 0},
		{duration / 1000, (duration % 1000) * 1000}
	};
	if (timer_sethandler())
		return FAILURE;
	if (setitimer(ITIMER_REAL, &setting, NULL))
		return FAILURE;
	timer_timeout = 0;
	return SUCCESS;
}

/*
 *  Stop overall test timer.
 */
static int stop_tt(void)
{
	sigset_t mask;
	struct sigaction act;
	act.sa_handler = SIG_DFL;
	act.sa_flags = 0;
	act.sa_restorer = NULL;
	sigemptyset(&act.sa_mask);
	if (sigaction(SIGALRM, &act, NULL))
		return FAILURE;
	timer_timeout = 0;
	sigemptyset(&mask);
	sigaddset(&mask, SIGALRM);
	sigprocmask(SIG_BLOCK, &mask, NULL);
	return SUCCESS;
}

/*
 *  -------------------------------------------------------------------------
 *
 *  M2PA Message Definitions
 *
 *  -------------------------------------------------------------------------
 */

#define M2PA_PPI		5

#define M2PA_MESSAGE_CLASS	11

#define M2PA_VERSION		1

#define M2PA_MTYPE_DATA		1
#define M2PA_MTYPE_STATUS	2
#define M2PA_MTYPE_PROVING	3
#define M2PA_MTYPE_ACK		4

#define M2PA_DATA_MESSAGE	\
	__constant_htonl((M2PA_VERSION<<24)|(M2PA_MESSAGE_CLASS<<8)|M2PA_MTYPE_DATA)
#define M2PA_STATUS_MESSAGE	\
	__constant_htonl((M2PA_VERSION<<24)|(M2PA_MESSAGE_CLASS<<8)|M2PA_MTYPE_STATUS)
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
#define M2PA_PROVING_MESSAGE	\
	__constant_htonl((M2PA_VERSION<<24)|(M2PA_MESSAGE_CLASS<<8)|M2PA_MTYPE_PROVING)
#endif
#if defined(M2PA_VERSION_DRAFT3_1)
#define M2PA_ACK_MESSAGE	\
	__constant_htonl((M2PA_VERSION<<24)|(M2PA_MESSAGE_CLASS<<8)|M2PA_MTYPE_ACK)
#endif

#define M2PA_STATUS_STREAM	0
#define M2PA_DATA_STREAM	1

#define M2PA_STATUS_ALIGNMENT			(__constant_htonl(1))
#define M2PA_STATUS_PROVING_NORMAL		(__constant_htonl(2))
#define M2PA_STATUS_PROVING_EMERGENCY		(__constant_htonl(3))
#define M2PA_STATUS_IN_SERVICE			(__constant_htonl(4))
#define M2PA_STATUS_PROCESSOR_OUTAGE		(__constant_htonl(5))
#define M2PA_STATUS_PROCESSOR_OUTAGE_ENDED	(__constant_htonl(6))
#define M2PA_STATUS_BUSY			(__constant_htonl(7))
#define M2PA_STATUS_BUSY_ENDED			(__constant_htonl(8))
#define M2PA_STATUS_OUT_OF_SERVICE		(__constant_htonl(9))
#if defined(M2PA_VERSION_DRAFT4)||defined(M2PA_VERSION_DRAFT4_1)||defined(M2PA_VERSION_DRAFT4_9)
#define M2PA_STATUS_NONE			(__constant_htonl(10))
#endif
#define M2PA_STATUS_INVALID			(__constant_htonl(11))

/*
 *  -------------------------------------------------------------------------
 *
 *  Definitions of signals and events.
 *
 *  -------------------------------------------------------------------------
 */

#define OUT_OF_SERVICE		1	/* M2PA Status signals */
#define ALIGNMENT		2
#define PROVING_NORMAL		3
#define PROVING_EMERG		4
#define IN_SERVICE		5
#define PROCESSOR_OUTAGE	6
#define PROCESSOR_ENDED		7
#define BUSY			8
#define BUSY_ENDED		9
#define INVALID_STATUS		10

#define DATA			20	/* Protocol Tester (PT) signals and events */
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
#define PROVING			21
#endif
#define ACK			22

#define TX_BREAK		30
#define TX_MAKE			31
#define BAD_ACK			32
#define MSU_TOO_SHORT		29

#if 0
#define FISU			20
#define FISU_S			21
#define FISU_CORRUPT		23
#define FISU_CORRUPT_S		24
#define MSU_SEVEN_ONES		27
#define MSU_TOO_LONG		28
#define FISU_FISU_1FLAG		60
#define FISU_FISU_2FLAG		61
#define MSU_MSU_1FLAG		62
#define MSU_MSU_2FLAG		63
#endif

#define TIMEOUT			40	/* TIMER events */
#define COUNT			41
#define TRIES			39
#define ETC			49

#if 0
#define SIB_S			42
#endif

#define IUT_IN_SERVICE		43	/* Implementation Under Test (IUT) events */
#define IUT_OUT_OF_SERVICE	44
#define IUT_RPO			45
#define IUT_RPR			46
#define IUT_DATA		47

#define POWER_ON		200	/* Implementation Under Test (IUT) signals */
#define START			201
#define STOP			202
#define LPO			203
#define LPR			204
#define EMERG			205
#define CEASE			206
#define SEND_MSU		207
#define SEND_MSU_S		208
#define CONG_A			209
#define CONG_D			210
#define NO_CONG			211
#define CLEARB			212

#define CONN_REQ		300	/* MGMT controls */
#define CONN_IND		301
#define CONN_RES		302
#define CONN_CON		303
#define DISCON_REQ		304
#define DISCON_IND		305
#define INFO_REQ		306
#define INFO_ACK		307
#define BIND_REQ		308
#define BIND_ACK		309
#define OK_ACK			310
#define ERROR_ACK		311
#define OPTMGMT_REQ		312

#define ENABLE_REQ		400
#define ENABLE_CON		401
#define DISABLE_REQ		402
#define DISABLE_CON		403
#define ERROR_IND		404

#define UNKNOWN			48

#define NO_MSG			-1

/*
 *  -------------------------------------------------------------------------
 *
 *  Globals
 *
 *  -------------------------------------------------------------------------
 */

static int state = 0;
static int event = 0;
static int count = 0;
static int tries = 0;
static int expand = 0;
static int debug = 1;
static int verbose = 0;
static long beg_time = 0;

static size_t nacks = 1;

static unsigned long iut_options = 0;

/* listening file descriptor */
static int mgm_fd = 0;
static ulong mgm_tok = 0;
static ulong mgm_seq = 0;
static unsigned char mgm_buf[BUFSIZE];

/* protocol tester file descriptor */
static int pt_fd = 0;
static ulong pt_tok = 0;
static ulong pt_seq = 0;
static unsigned char pt_buf[BUFSIZE];
static unsigned char pt_fib = 0x0;
static unsigned int pt_fsn = 0x0;
static unsigned char pt_bib = 0x0;
static unsigned int pt_bsn = 0x0;
//static unsigned char   pt_li  = 0;
//static unsigned char   pt_sio = 0;

/* implementation under test file descriptor */
static int iut_fd = 0;
static ulong iut_tok = 0;
static ulong iut_seq = 0;
static unsigned char iut_buf[BUFSIZE];
static unsigned char iut_fib = 0x0;
static unsigned int iut_fsn = 0x0;
static unsigned char iut_bib = 0x0;
static unsigned int iut_bsn = 0x0;

#define MSU_LEN 35
static int msu_len = MSU_LEN;

/* some globals for compressing events */
static int oldpsb = 0;				/* last pt sequence number and indicator bits */
static int oldmsg = 0;				/* last pt message */
static int cntmsg = 0;				/* repeats of pt message */
static int oldact = 0;				/* last iut action */
static int cntact = 0;				/* repeats of iut action */
static int oldisb = 0;				/* last iut sequence number and indicator bits */
static int oldret = 0;
static int cntret = 0;
static int oldprm = 0;
static int cntprm = 0;
static int oldmgm = 0;				/* last management control */
static int cntmgm = 0;				/* repeats of management control */

union primitives {
	ulong prim;
	union LMI_primitives lmi;
	union SDL_primitives sdl;
	union SDT_primitives sdt;
	union SL_primitives sl;
	union N_primitives npi;
};

/*
 *  -------------------------------------------------------------------------
 *
 *  Send messages from the Protocol Tester
 *
 *  -------------------------------------------------------------------------
 */
static void pt_printf(char *l, char *r)
{
#if defined(M2PA_VERSION_DRAFT4)||defined(M2PA_VERSION_DRAFT4_1)||defined(M2PA_VERSION_DRAFT4_9)
	if (pt_fsn || pt_bsn)
		printf("%23.23s  ---[%04x, %04x]-->  %-23.23s\n", l, pt_fsn, pt_bsn, r);
	else
#endif
		printf("%23.23s  ----------------->  %-23.23s\n", l, r);
	FFLUSH(stdout);
}

#define send pt_send
static int send(int msg)
{
	uint32_t status = 0;
	char cbuf[BUFSIZE];
	struct strbuf ctrl = { sizeof(*cbuf), 0, cbuf };
	struct strbuf data = { sizeof(*pt_buf), 0, pt_buf };
	union primitives *p = (union primitives *) cbuf;
	if (msg != oldmsg) {
		oldmsg = msg;
		if (verbose) {
			if (cntmsg) {
				printf
				    ("             Ct=%5d                                               \n",
				     cntmsg + 1);
				FFLUSH(stdout);
			}
		}
		cntmsg = 0;
	} else if (!expand)
		cntmsg++;
	switch (msg) {
	case ALIGNMENT:
		if (!cntmsg)
			pt_printf("ALIGNMENT", "");
		status = M2PA_STATUS_ALIGNMENT;
		goto pt_status_putmsg;
	case PROVING_NORMAL:
		if (!cntmsg)
			pt_printf("PROVING-NORMAL", "");
		status = M2PA_STATUS_PROVING_NORMAL;
		goto pt_status_putmsg;
	case PROVING_EMERG:
		if (!cntmsg)
			pt_printf("PROVING-EMERGENCY", "");
		status = M2PA_STATUS_PROVING_EMERGENCY;
		goto pt_status_putmsg;
	case OUT_OF_SERVICE:
		if (!cntmsg)
			pt_printf("OUT-OF-SERVICE", "");
		status = M2PA_STATUS_OUT_OF_SERVICE;
		goto pt_status_putmsg;
	case IN_SERVICE:
		if (!cntmsg)
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			pt_printf("IN-SERVICE", "");
#else
			pt_printf("READY", "");
#endif
		status = M2PA_STATUS_IN_SERVICE;
		goto pt_status_putmsg;
	case PROCESSOR_OUTAGE:
		if (!cntmsg)
			pt_printf("PROCESSOR-OUTAGE", "");
		status = M2PA_STATUS_PROCESSOR_OUTAGE;
		goto pt_status_putmsg;
	case PROCESSOR_ENDED:
		if (!cntmsg)
			pt_printf("PROCESSOR-OUTAGE-ENDED", "");
		status = M2PA_STATUS_PROCESSOR_OUTAGE_ENDED;
		goto pt_status_putmsg;
	case BUSY_ENDED:
		if (!cntmsg)
			pt_printf("BUSY-ENDED", "");
		status = M2PA_STATUS_BUSY_ENDED;
		goto pt_status_putmsg;
	case BUSY:
		if (!cntmsg)
			pt_printf("BUSY", "");
		status = M2PA_STATUS_BUSY;
		goto pt_status_putmsg;
	case COUNT:
		printf("           Ct = %5d    ----------------->                         \n", count);
		return SUCCESS;
	case TRIES:
		printf("       %5d iterations  ----------------->                         \n", tries);
		FFLUSH(stdout);
		return SUCCESS;
	case ETC:
		printf("                    .    ----------------->                         \n");
		printf("                    .    ----------------->                         \n");
		printf("                    .    ----------------->                         \n");
		FFLUSH(stdout);
		return SUCCESS;
	case INVALID_STATUS:
		if (!cntmsg)
			pt_printf("[INVALID-STATUS]", "");
		status = M2PA_STATUS_INVALID;
		goto pt_status_putmsg;
	      pt_status_putmsg:
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
		data.len = 3 * sizeof(uint32_t);
		ctrl.len = sizeof(p->npi.data_req) + sizeof(ptconf.qos_data);
		((uint32_t *) pt_buf)[0] = M2PA_STATUS_MESSAGE;
		((uint32_t *) pt_buf)[1] = htonl(data.len);
		((uint32_t *) pt_buf)[2] = status;
		p->npi.type = N_DATA_REQ;
		p->npi.data_req.DATA_xfer_flags = 0;
		bcopy(&ptconf.qos_data, (&p->npi.data_req) + 1, sizeof(ptconf.qos_data));
		if (putmsg(pt_fd, &ctrl, &data, 0) < 0) {
			printf("****ERROR: putmsg failed!\n");
			printf("           %s: %s\n", __FUNCTION__, strerror(errno));
			FFLUSH(stdout);
			return FAILURE;
		}
		return SUCCESS;
#elif defined(M2PA_VERSION_DRAFT4)||defined(M2PA_VERSION_DRAFT4_1)
		data.len = 4 * sizeof(uint32_t);
		ctrl.len = sizeof(p->npi.data_req) + sizeof(ptconf.qos_data);
		((uint32_t *) pt_buf)[0] = M2PA_STATUS_MESSAGE;
		((uint32_t *) pt_buf)[1] = htonl(data.len);
		((uint16_t *) pt_buf)[4] = htons(pt_bsn);
		((uint16_t *) pt_buf)[5] = htons(pt_fsn);
		((uint32_t *) pt_buf)[3] = status;
		p->npi.type = N_DATA_REQ;
		p->npi.data_req.DATA_xfer_flags = 0;
		bcopy(&ptconf.qos_data, (&p->npi.data_req) + 1, sizeof(ptconf.qos_data));
		if (putmsg(pt_fd, &ctrl, &data, 0) < 0) {
			printf("****ERROR: putmsg failed!\n");
			printf("           %s: %s\n", __FUNCTION__, strerror(errno));
			FFLUSH(stdout);
			return FAILURE;
		}
		return SUCCESS;
#elif defined(M2PA_VERSION_DRAFT4_9)||defined(M2PA_VERSION_DRAFT5)||defined(M2PA_VERSION_DRAFT5_1)||defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)
		data.len = 5 * sizeof(uint32_t);
		ctrl.len = sizeof(p->npi.data_req) + sizeof(ptconf.qos_data);
		((uint32_t *) pt_buf)[0] = M2PA_STATUS_MESSAGE;
		((uint32_t *) pt_buf)[1] = htonl(data.len);
		((uint32_t *) pt_buf)[2] = htonl(pt_bsn & 0xffffff);
		((uint32_t *) pt_buf)[3] = htonl(pt_fsn & 0xffffff);
		((uint32_t *) pt_buf)[4] = status;
		p->npi.type = N_DATA_REQ;
		p->npi.data_req.DATA_xfer_flags = 0;
		bcopy(&ptconf.qos_data, (&p->npi.data_req) + 1, sizeof(ptconf.qos_data));
		if (putmsg(pt_fd, &ctrl, &data, 0) < 0) {
			printf("****ERROR: putmsg failed!\n");
			printf("           %s: %s\n", __FUNCTION__, strerror(errno));
			FFLUSH(stdout);
			return FAILURE;
		}
		return SUCCESS;
#elif defined(M2PA_VERSION_DRAFT6_9)||defined(M2PA_VERSION_DRAFT7)
		data.len = 3 * sizeof(uint32_t);
		ctrl.len = sizeof(p->npi.data_req) + sizeof(ptconf.qos_data);
		((uint32_t *) pt_buf)[0] = M2PA_STATUS_MESSAGE;
		((uint32_t *) pt_buf)[1] = htonl(data.len);
		((uint32_t *) pt_buf)[2] = status;
		p->npi.type = N_DATA_REQ;
		p->npi.data_req.DATA_xfer_flags = 0;
		bcopy(&ptconf.qos_data, (&p->npi.data_req) + 1, sizeof(ptconf.qos_data));
		if (putmsg(pt_fd, &ctrl, &data, 0) < 0) {
			printf("****ERROR: putmsg failed!\n");
			printf("           %s: %s\n", __FUNCTION__, strerror(errno));
			FFLUSH(stdout);
			return FAILURE;
		}
		return SUCCESS;
#else
		return FAILURE;
#endif
	case MSU_TOO_SHORT:
		msu_len = 1;
		goto send_data;
	case DATA:
		if (msu_len > BUFSIZE - 10)
			msu_len = BUFSIZE - 10;
	      send_data:
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
		if (!cntmsg) {
			printf("   [%3d bytes]     DATA  ----------------->                         \n", msu_len);
			FFLUSH(stdout);
		}
		data.len = 2 * sizeof(uint32_t) + msu_len + 1;
		ctrl.len = sizeof(p->npi.data_req) + sizeof(ptconf.qos_data);
		((uint32_t *) pt_buf)[0] = M2PA_DATA_MESSAGE;
		((uint32_t *) pt_buf)[1] = htonl(data.len);
		memset(&(((uint32_t *) pt_buf)[2]), 'B', msu_len + 1);
		memset(&(((uint32_t *) pt_buf)[2]), 0, 1);
		p->npi.type = N_DATA_REQ;
#if defined(M2PA_VERSION_DRAFT3)
		p->npi.data_req.DATA_xfer_flags = N_RC_FLAG;
#else
		p->npi.data_req.DATA_xfer_flags = 0;
#endif
		bcopy(&ptconf.qos_data, (&p->npi.data_req) + 1, sizeof(ptconf.qos_data));
		if (putmsg(pt_fd, &ctrl, &data, 0) < 0) {
			printf("****ERROR: putmsg failed!\n");
			printf("           %s: %s\n", __FUNCTION__, strerror(errno));
			FFLUSH(stdout);
			return FAILURE;
		}
		return SUCCESS;
#elif defined(M2PA_VERSION_DRAFT4)||defined(M2PA_VERSION_DRAFT4_1)
		pt_fsn++;
		if (!cntmsg) {
			printf
			    ("   [%3d bytes]     DATA  ---[%04x, %04x]-->                         \n",
			     msu_len, pt_fsn, pt_bsn);
			FFLUSH(stdout);
		}
		data.len = 3 * sizeof(uint32_t) + msu_len + 1;
		ctrl.len = sizeof(p->npi.data_req) + sizeof(ptconf.qos_data);
		((uint32_t *) pt_buf)[0] = M2PA_DATA_MESSAGE;
		((uint32_t *) pt_buf)[1] = htonl(data.len);
		((uint16_t *) pt_buf)[4] = htons(pt_bsn);
		((uint16_t *) pt_buf)[5] = htons(pt_fsn);
		memset(&(((uint32_t *) pt_buf)[3]), 'B', msu_len + 1);
		memset(&(((uint32_t *) pt_buf)[3]), 0, 1);
		p->npi.type = N_DATA_REQ;
		p->npi.data_req.DATA_xfer_flags = 0;
		bcopy(&ptconf.qos_data, (&p->npi.data_req) + 1, sizeof(ptconf.qos_data));
		if (putmsg(pt_fd, &ctrl, &data, 0) < 0) {
			printf("****ERROR: putmsg failed!\n");
			printf("           %s: %s\n", __FUNCTION__, strerror(errno));
			FFLUSH(stdout);
			return FAILURE;
		}
		return SUCCESS;
#elif defined(M2PA_VERSION_DRAFT4_9)||defined(M2PA_VERSION_DRAFT5)||defined(M2PA_VERSION_DRAFT5_1)||defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)||defined(M2PA_VERSION_DRAFT6_9)||defined(M2PA_VERSION_DRAFT7)
		pt_fsn++;
		if (!cntmsg) {
			printf
			    ("   [%3d bytes]     DATA  ---[%04x, %04x]-->                         \n",
			     msu_len, pt_fsn, pt_bsn);
			FFLUSH(stdout);
		}
		data.len = 4 * sizeof(uint32_t) + msu_len + 1;
		ctrl.len = sizeof(p->npi.data_req) + sizeof(ptconf.qos_data);
		((uint32_t *) pt_buf)[0] = M2PA_DATA_MESSAGE;
		((uint32_t *) pt_buf)[1] = htonl(data.len);
		((uint32_t *) pt_buf)[2] = htonl(pt_bsn & 0xffffff);
		((uint32_t *) pt_buf)[3] = htonl(pt_fsn & 0xffffff);
		memset(&(((uint32_t *) pt_buf)[4]), 'B', msu_len + 1);
		memset(&(((uint32_t *) pt_buf)[4]), 0, 1);
		p->npi.type = N_DATA_REQ;
		p->npi.data_req.DATA_xfer_flags = 0;
		bcopy(&ptconf.qos_data, (&p->npi.data_req) + 1, sizeof(ptconf.qos_data));
		if (putmsg(pt_fd, &ctrl, &data, 0) < 0) {
			printf("****ERROR: putmsg failed!\n");
			printf("           %s: %s\n", __FUNCTION__, strerror(errno));
			FFLUSH(stdout);
			return FAILURE;
		}
		return SUCCESS;
#else
		return FAILURE;
#endif
	case BAD_ACK:
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
		return INCONCLUSIVE;
#else
		pt_fsn = 0xffff;
		goto pt_ack_putmsg;
#endif
	case ACK:
#if defined(M2PA_VERSION_DRAFT3_1)
		pt_printf("ACK", "");
		data.len = 3 * sizeof(uint32_t);
		ctrl.len = sizeof(p->npi.exdata_req) + sizeof(ptconf.qos_data);
		((uint32_t *) pt_buf)[0] = M2PA_ACK_MESSAGE;
		((uint32_t *) pt_buf)[1] = htonl(data.len);
		((uint32_t *) pt_buf)[2] = htonl(nacks);
		p->npi.type = N_EXDATA_REQ;
		bcopy(&ptconf.qos_data, (&p->npi.exdata_req) + 1, sizeof(ptconf.qos_data));
		if (putmsg(pt_fd, &ctrl, &data, 0) < 0) {
			printf("****ERROR: putmsg failed!\n");
			printf("           %s: %s\n", __FUNCTION__, strerror(errno));
			FFLUSH(stdout);
			return FAILURE;
		}
		return SUCCESS;
#elif defined(M2PA_VERSION_DRAFT4_1)
	      pt_ack_putmsg:
		pt_printf("IN-SERVICE", "");
		data.len = 4 * sizeof(uint32_t);
		ctrl.len = sizeof(p->npi.exdata_req) + sizeof(ptconf.qos_data);
		((uint32_t *) pt_buf)[0] = M2PA_STATUS_MESSAGE;
		((uint32_t *) pt_buf)[1] = htonl(data.len);
		((uint16_t *) pt_buf)[4] = htons(pt_bsn);
		((uint16_t *) pt_buf)[5] = htons(pt_fsn);
		((uint32_t *) pt_buf)[3] = M2PA_STATUS_NONE;
		p->npi.type = N_EXDATA_REQ;
		bcopy(&ptconf.qos_data, (&p->npi.exdata_req) + 1, sizeof(ptconf.qos_data));
		if (putmsg(pt_fd, &ctrl, &data, 0) < 0) {
			printf("****ERROR: putmsg failed!\n");
			printf("           %s: %s\n", __FUNCTION__, strerror(errno));
			FFLUSH(stdout);
			return FAILURE;
		}
		return SUCCESS;
#elif defined(M2PA_VERSION_DRAFT4_9)
	      pt_ack_putmsg:
		pt_printf("IN-SERVICE", "");
		data.len = 5 * sizeof(uint32_t);
		ctrl.len = sizeof(p->npi.exdata_req) + sizeof(ptconf.qos_data);
		((uint32_t *) pt_buf)[0] = M2PA_STATUS_MESSAGE;
		((uint32_t *) pt_buf)[1] = htonl(data.len);
		((uint32_t *) pt_buf)[2] = htons(pt_bsn & 0xffffff);
		((uint32_t *) pt_buf)[3] = htons(pt_fsn & 0xffffff);
		((uint32_t *) pt_buf)[4] = M2PA_STATUS_NONE;
		p->npi.type = N_EXDATA_REQ;
		bcopy(&ptconf.qos_data, (&p->npi.exdata_req) + 1, sizeof(ptconf.qos_data));
		if (putmsg(pt_fd, &ctrl, &data, 0) < 0) {
			printf("****ERROR: putmsg failed!\n");
			printf("           %s: %s\n", __FUNCTION__, strerror(errno));
			FFLUSH(stdout);
			return FAILURE;
		}
		return SUCCESS;
#elif defined(M2PA_VERSION_DRAFT5)||defined(M2PA_VERSION_DRAFT5_1)
	      pt_ack_putmsg:
		pt_printf("IN-SERVICE", "");
		data.len = 5 * sizeof(uint32_t);
		ctrl.len = sizeof(p->npi.exdata_req) + sizeof(ptconf.qos_data);
		((uint32_t *) pt_buf)[0] = M2PA_STATUS_MESSAGE;
		((uint32_t *) pt_buf)[1] = htonl(data.len);
		((uint32_t *) pt_buf)[2] = htons(pt_bsn & 0xffffff);
		((uint32_t *) pt_buf)[3] = htons(pt_fsn & 0xffffff);
		((uint32_t *) pt_buf)[4] = M2PA_STATUS_IN_SERVICE;
		p->npi.type = N_EXDATA_REQ;
		bcopy(&ptconf.qos_data, (&p->npi.exdata_req) + 1, sizeof(ptconf.qos_data));
		if (putmsg(pt_fd, &ctrl, &data, 0) < 0) {
			printf("****ERROR: putmsg failed!\n");
			printf("           %s: %s\n", __FUNCTION__, strerror(errno));
			FFLUSH(stdout);
			return FAILURE;
		}
		return SUCCESS;
#elif defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)||defined(M2PA_VERSION_DRAFT6_9)
	      pt_ack_putmsg:
		printf("               DATA-ACK  ---[%04x, %04x]-->                         \n", pt_fsn, pt_bsn);
		FFLUSH(stdout);
		data.len = 4 * sizeof(uint32_t);
		ctrl.len = sizeof(p->npi.data_req) + sizeof(ptconf.qos_data);
		((uint32_t *) pt_buf)[0] = M2PA_DATA_MESSAGE;
		((uint32_t *) pt_buf)[1] = htonl(data.len);
		((uint32_t *) pt_buf)[2] = htonl(pt_bsn & 0xffffff);
		((uint32_t *) pt_buf)[3] = htonl(pt_fsn & 0xffffff);
		p->npi.type = N_DATA_REQ;
		p->npi.data_req.DATA_xfer_flags = 0;
		bcopy(&ptconf.qos_data, (&p->npi.data_req) + 1, sizeof(ptconf.qos_data));
		if (putmsg(pt_fd, &ctrl, &data, 0) < 0) {
			printf("****ERROR: putmsg failed!\n");
			printf("           %s: %s\n", __FUNCTION__, strerror(errno));
			FFLUSH(stdout);
			return FAILURE;
		}
		return SUCCESS;
#else
		return INCONCLUSIVE;
#endif
	case STOP:
		printf("                  :stop                                             \n");
		FFLUSH(stdout);
		return SUCCESS;
	case POWER_ON:
		printf("              :power on                                             \n");
		FFLUSH(stdout);
		return SUCCESS;
	case LPO:
		printf("               :set lpo                                             \n");
		FFLUSH(stdout);
		return SUCCESS;
	case LPR:
		printf("             :clear lpo                                             \n");
		FFLUSH(stdout);
		return SUCCESS;
	case EMERG:
		printf("             :set emerg                                             \n");
		FFLUSH(stdout);
		return SUCCESS;
	case CEASE:
		printf("           :clear emerg                                             \n");
		FFLUSH(stdout);
		return SUCCESS;
	case CONG_A:
		printf("        :make congested                                             \n");
		FFLUSH(stdout);
		return SUCCESS;
	case CONG_D:
		printf("        :make congested                                             \n");
		FFLUSH(stdout);
		return SUCCESS;
	case NO_CONG:
		printf("       :clear congested                                             \n");
		FFLUSH(stdout);
		return SUCCESS;
	case START:
		printf("                 :start                                             \n");
		FFLUSH(stdout);
		return SUCCESS;
	case TX_BREAK:
		printf("              :tx break                                             \n");
		FFLUSH(stdout);
		p->npi.type = N_DISCON_REQ;
		p->npi.discon_req.DISCON_reason = 0;
		p->npi.discon_req.RES_length = 0;
		p->npi.discon_req.RES_offset = 0;
		p->npi.discon_req.SEQ_number = 0;
		ctrl.len = sizeof(N_discon_req_t);
		goto pt_control_putmsg;
	case TX_MAKE:
		return SUCCESS;

	case ENABLE_REQ:
		if (verbose) {
			printf("                :enable                                             \n");
			FFLUSH(stdout);
		}
		return SUCCESS;
	case DISABLE_REQ:
		if (verbose) {
			printf("               :disable                                             \n");
			FFLUSH(stdout);
		}
		return SUCCESS;
	case DISCON_REQ:
		printf("            :disconnect                                             \n");
		FFLUSH(stdout);
		p->npi.type = N_DISCON_REQ;
		p->npi.discon_req.DISCON_reason = 0;
		p->npi.discon_req.RES_length = 0;
		p->npi.discon_req.RES_offset = 0;
		p->npi.discon_req.SEQ_number = 0;
		ctrl.len = sizeof(N_discon_req_t);
		goto pt_control_putmsg;
	case BIND_REQ:
		if (verbose) {
			printf("                  :bind                                             \n");
			FFLUSH(stdout);
		}
		p->npi.type = N_BIND_REQ;
		p->npi.bind_req.ADDR_length = sizeof(ptconf.loc);
		p->npi.bind_req.ADDR_offset = sizeof(p->npi.bind_req);
		p->npi.bind_req.CONIND_number = 0;
		p->npi.bind_req.BIND_flags = TOKEN_REQUEST;
		p->npi.bind_req.PROTOID_length = 0;
		p->npi.bind_req.PROTOID_offset = 0;
		bcopy(&ptconf.loc, (&p->npi.bind_req + 1), sizeof(ptconf.loc));
		ctrl.len = sizeof(N_bind_req_t) + sizeof(ptconf.loc);
		goto pt_control_putmsg;
	case OPTMGMT_REQ:
		if (verbose) {
			printf("           :optmgmt req                                             \n");
			FFLUSH(stdout);
		}
		p->npi.type = N_OPTMGMT_REQ;
		p->npi.optmgmt_req.QOS_length = sizeof(ptconf.qos);
		p->npi.optmgmt_req.QOS_offset = sizeof(p->npi.optmgmt_req);
		p->npi.optmgmt_req.OPTMGMT_flags = 0;
		bcopy(&ptconf.qos, (&p->npi.optmgmt_req + 1), sizeof(ptconf.qos));
		ctrl.len = sizeof(N_optmgmt_req_t) + sizeof(ptconf.qos);
		goto pt_control_putmsg;
	      pt_control_putmsg:
		if (putmsg(pt_fd, &ctrl, NULL, 0) < 0) {
			printf("****ERROR: putmsg failed!\n");
			printf("           %s: %s\n", __FUNCTION__, strerror(errno));
			FFLUSH(stdout);
			return FAILURE;
		}
		return SUCCESS;
	default:
		if (verbose || !cntmsg) {
			printf("              :????????                                             \n");
			FFLUSH(stdout);
		}
		return FAILURE;
	}
}

/*
 *  -------------------------------------------------------------------------
 *
 *  Signal commands to the Implementation Under Test
 *
 *  -------------------------------------------------------------------------
 */
#define signal iut_signal
static int signal(int action)
{
	char cbuf[BUFSIZE];
	char dbuf[BUFSIZE];
	struct strbuf ctrl = { sizeof(*cbuf), 0, cbuf };
	struct strbuf data = { sizeof(*dbuf), 0, dbuf };
	union primitives *p = (union primitives *) cbuf;
	if (action != oldact) {
		oldact = action;
		if (verbose) {
			if (cntact) {
				printf
				    ("                                                     Ct=%5d       \n",
				     cntact + 1);
				FFLUSH(stdout);
			}
		}
		cntact = 0;
	} else if (!expand)
		cntact++;
	switch (action) {
	case POWER_ON:
		printf("                                             :power on              \n");
		FFLUSH(stdout);
		p->sl.sl_primitive = SL_POWER_ON_REQ;
		ctrl.len = SL_POWER_ON_REQ_SIZE;
		goto signal_iut_putmsg;
	case START:
		printf("                                             :start                 \n");
		FFLUSH(stdout);
		p->sl.sl_primitive = SL_START_REQ;
		ctrl.len = SL_START_REQ_SIZE;
		goto signal_iut_putmsg;
	case STOP:
		printf("                                             :stop                  \n");
		FFLUSH(stdout);
		p->sl.sl_primitive = SL_STOP_REQ;
		ctrl.len = SL_STOP_REQ_SIZE;
		goto signal_iut_putmsg;
	case LPO:
		printf("                                             :set lpo               \n");
		FFLUSH(stdout);
		p->sl.sl_primitive = SL_LOCAL_PROCESSOR_OUTAGE_REQ;
		ctrl.len = SL_LOCAL_PROC_OUTAGE_REQ_SIZE;
		goto signal_iut_putmsg;
	case LPR:
		printf("                                             :clear lpo             \n");
		FFLUSH(stdout);
		p->sl.sl_primitive = SL_RESUME_REQ;
		ctrl.len = SL_RESUME_REQ_SIZE;
		goto signal_iut_putmsg;
	case CONG_A:
		printf("                                             :make cong accept      \n");
		FFLUSH(stdout);
		p->sl.sl_primitive = SL_CONGESTION_ACCEPT_REQ;
		ctrl.len = SL_CONG_ACCEPT_REQ_SIZE;
		goto signal_iut_putmsg;
	case CONG_D:
		printf("                                             :make cong discard     \n");
		FFLUSH(stdout);
		p->sl.sl_primitive = SL_CONGESTION_DISCARD_REQ;
		ctrl.len = SL_CONG_DISCARD_REQ_SIZE;
		goto signal_iut_putmsg;
	case NO_CONG:
		printf("                                             :clear congestion      \n");
		FFLUSH(stdout);
		p->sl.sl_primitive = SL_NO_CONGESTION_REQ;
		ctrl.len = SL_NO_CONG_REQ_SIZE;
		goto signal_iut_putmsg;
	case CLEARB:
		printf("                                             :clear buffers         \n");
		FFLUSH(stdout);
		p->sl.sl_primitive = SL_CLEAR_BUFFERS_REQ;
		ctrl.len = SL_CLEAR_BUFFERS_REQ_SIZE;
		goto signal_iut_putmsg;
	case EMERG:
		printf("                                             :set emergency         \n");
		FFLUSH(stdout);
		p->sl.sl_primitive = SL_EMERGENCY_REQ;
		ctrl.len = SL_EMERGENCY_REQ_SIZE;
		goto signal_iut_putmsg;
	case CEASE:
		printf("                                             :clear emergency       \n");
		FFLUSH(stdout);
		p->sl.sl_primitive = SL_EMERGENCY_CEASES_REQ;
		ctrl.len = SL_EMERGENCY_CEASES_REQ_SIZE;
	      signal_iut_putmsg:
		if (putmsg(iut_fd, &ctrl, NULL, RS_HIPRI) < 0) {
			printf("                                  ****ERROR: putmsg failed!\n");
			printf("                                             %s: %s\n",
			       __FUNCTION__, strerror(errno));
			return FAILURE;
		}
		return SUCCESS;
	case COUNT:
		printf("                                                     Ct=%5d       \n", count);
		FFLUSH(stdout);
		return SUCCESS;
	case TRIES:
		printf("                                                     %4d iterations\n", tries);
		FFLUSH(stdout);
		return SUCCESS;
	case ETC:
		printf("                                                     .              \n");
		printf("                                                     .              \n");
		printf("                                                     .              \n");
		FFLUSH(stdout);
		return SUCCESS;
	case SEND_MSU:
		if (!cntact) {
			printf("                                             :msu                   \n");
			FFLUSH(stdout);
		}
	case SEND_MSU_S:
		if (msu_len > BUFSIZE - 10)
			msu_len = BUFSIZE - 10;
		p->sl.sl_primitive = SL_PDU_REQ;
		ctrl.len = SL_PDU_REQ_SIZE;
		memset(dbuf, 'B', msu_len);
		data.len = msu_len;
		if (putmsg(iut_fd, NULL, &data, 0) < 0) {
			printf("                                  ****ERROR: putmsg failed!\n");
			printf("                                             %s: %s\n",
			       __FUNCTION__, strerror(errno));
			FFLUSH(stdout);
			return FAILURE;
		}
		return SUCCESS;
	case ENABLE_REQ:
		if (verbose) {
			printf("                                             :enable                \n");
			FFLUSH(stdout);
		}
		p->lmi.enable_req.lmi_primitive = LMI_ENABLE_REQ;
		ctrl.len = sizeof(p->lmi.enable_req);
		goto iut_lmi_putmsg;
	case DISABLE_REQ:
		if (verbose) {
			printf("                                             :disable               \n");
			FFLUSH(stdout);
		}
		p->lmi.disable_req.lmi_primitive = LMI_DISABLE_REQ;
		ctrl.len = sizeof(p->lmi.disable_req);
		goto iut_lmi_putmsg;
	      iut_lmi_putmsg:
		if (putmsg(iut_fd, &ctrl, NULL, RS_HIPRI) < 0) {
			printf("                                  ****ERROR: putmsg failed!\n");
			printf("                                             %s: %s\n",
			       __FUNCTION__, strerror(errno));
			FFLUSH(stdout);
			return FAILURE;
		}
		return SUCCESS;
	case CONN_REQ:
		printf("                                             :connect               \n");
		FFLUSH(stdout);
		p->npi.type = N_CONN_REQ;
		p->npi.conn_req.DEST_length = sizeof(iutconf.rem);
		p->npi.conn_req.DEST_offset = sizeof(p->npi.conn_req);
		p->npi.conn_req.CONN_flags = REC_CONF_OPT | EX_DATA_OPT;
		p->npi.conn_req.QOS_length = 0;
		p->npi.conn_req.QOS_offset = 0;
		bcopy(&iutconf.rem, (&p->npi.conn_req + 1), sizeof(iutconf.rem));
		ctrl.len = sizeof(N_conn_req_t) + sizeof(iutconf.rem);
		goto iut_control_putmsg;
	case BIND_REQ:
		if (verbose) {
			printf("                                             <bind req              \n");
			FFLUSH(stdout);
		}
		p->npi.type = N_BIND_REQ;
		p->npi.bind_req.ADDR_length = sizeof(iutconf.loc);
		p->npi.bind_req.ADDR_offset = sizeof(p->npi.bind_req);
		p->npi.bind_req.CONIND_number = 0;
		p->npi.bind_req.BIND_flags = TOKEN_REQUEST;
		p->npi.bind_req.PROTOID_length = 0;
		p->npi.bind_req.PROTOID_offset = 0;
		bcopy(&iutconf.loc, (&p->npi.bind_req + 1), sizeof(iutconf.loc));
		ctrl.len = sizeof(N_bind_req_t) + sizeof(iutconf.loc);
		goto iut_control_putmsg;
	case DISCON_REQ:
		if (verbose) {
			printf("                                             :disconnect            \n");
			FFLUSH(stdout);
		}
		p->npi.type = N_DISCON_REQ;
		p->npi.discon_req.DISCON_reason = 0;
		p->npi.discon_req.RES_length = 0;
		p->npi.discon_req.RES_offset = 0;
		p->npi.discon_req.SEQ_number = 0;
		ctrl.len = sizeof(N_discon_req_t);
		goto iut_control_putmsg;
	case OPTMGMT_REQ:
		if (verbose) {
			printf("                                             <optmgmt req           \n");
			FFLUSH(stdout);
		}
		p->npi.type = N_OPTMGMT_REQ;
		p->npi.optmgmt_req.QOS_length = sizeof(iutconf.qos);
		p->npi.optmgmt_req.QOS_offset = sizeof(p->npi.optmgmt_req);
		p->npi.optmgmt_req.OPTMGMT_flags = 0;
		bcopy(&iutconf.qos, (&p->npi.optmgmt_req + 1), sizeof(iutconf.qos));
		ctrl.len = sizeof(N_optmgmt_req_t) + sizeof(iutconf.qos);
		goto iut_control_putmsg;
	      iut_control_putmsg:
		if (putmsg(iut_fd, &ctrl, NULL, 0) < 0) {
			printf("                                  ****ERROR: putmsg failed!\n");
			printf("                                             %s: %s\n",
			       __FUNCTION__, strerror(errno));
			FFLUSH(stdout);
			return FAILURE;
		}
		return SUCCESS;
	default:
		if (!cntact) {
			printf("                                             <????????              \n");
			FFLUSH(stdout);
		}
		return FAILURE;
	}
}

/*
 *  -------------------------------------------------------------------------
 *
 *  Control commands given to management stream.
 *
 *  -------------------------------------------------------------------------
 */
#define control mgm_control
static int control(int prim)
{
	char cbuf[BUFSIZE];
	struct strbuf ctrl = { sizeof(*cbuf), 0, cbuf };
	union primitives *p = (union primitives *) cbuf;
	if (prim != oldmgm) {
		oldmgm = prim;
		if (cntmgm) {
			printf
			    ("             Ct=%5d                                               \n", cntmgm + 1);
			FFLUSH(stdout);
		}
		cntmgm = 0;
	} else if (!expand)
		cntmgm++;
	switch (prim) {
	case CONN_RES:
		if (verbose) {
			printf("              >conn res                                             \n");
			FFLUSH(stdout);
		}
		p->npi.type = N_CONN_RES;
		p->npi.conn_res.TOKEN_value = pt_tok;
		p->npi.conn_res.RES_length = 0;
		p->npi.conn_res.RES_offset = 0;
		p->npi.conn_res.SEQ_number = mgm_seq;
		p->npi.conn_res.CONN_flags = REC_CONF_OPT | EX_DATA_OPT;
		p->npi.conn_res.QOS_length = 0;
		p->npi.conn_res.QOS_offset = 0;
		ctrl.len = sizeof(N_conn_res_t);
		goto mgm_control_putmsg;
	case BIND_REQ:
		if (verbose) {
			printf("              >bind req |                        \n");
			FFLUSH(stdout);
		}
		p->npi.type = N_BIND_REQ;
		p->npi.bind_req.ADDR_length = sizeof(mgmconf.loc);
		p->npi.bind_req.ADDR_offset = sizeof(p->npi.bind_req);
		p->npi.bind_req.CONIND_number = 2;
		p->npi.bind_req.BIND_flags = TOKEN_REQUEST;
		p->npi.bind_req.PROTOID_length = 0;
		p->npi.bind_req.PROTOID_offset = 0;
		bcopy(&mgmconf.loc, (&p->npi.bind_req + 1), sizeof(mgmconf.loc));
		ctrl.len = sizeof(N_bind_req_t) + sizeof(mgmconf.loc);
		goto mgm_control_putmsg;
	case OPTMGMT_REQ:
		if (verbose) {
			printf("           >optmgmt req |                        \n");
			FFLUSH(stdout);
		}
		p->npi.type = N_OPTMGMT_REQ;
		p->npi.optmgmt_req.QOS_length = sizeof(mgmconf.qos);
		p->npi.optmgmt_req.QOS_offset = sizeof(p->npi.optmgmt_req);
		p->npi.optmgmt_req.OPTMGMT_flags = 0;
		bcopy(&mgmconf.qos, (&p->npi.optmgmt_req + 1), sizeof(mgmconf.qos));
		ctrl.len = sizeof(N_optmgmt_req_t) + sizeof(mgmconf.qos);
		goto mgm_control_putmsg;
	      mgm_control_putmsg:
		if (putmsg(mgm_fd, &ctrl, NULL, 0) < 0) {
			printf("****ERROR: putmsg failed!\n");
			printf("           %s: %s\n", __FUNCTION__, strerror(errno));
			FFLUSH(stdout);
			return FAILURE;
		}
		return SUCCESS;
	default:
		if (!cntmgm) {
			printf("              >???????? |                        \n");
			FFLUSH(stdout);
		}
		return FAILURE;
	}
	return SUCCESS;
}

/*
 *  =========================================================================
 *
 *  DECODE DATA and CTRL
 *
 *  =========================================================================
 */
static int show_msus = 1;
static int show_fisus = 1;

/*
 *  -------------------------------------------------------------------------
 *
 *  Decode data at Protocol Tester
 *
 *  -------------------------------------------------------------------------
 */
static void iut_printf(char *l, char *r)
{
#if defined(M2PA_VERSION_DRAFT4)||defined(M2PA_VERSION_DRAFT4_1)||defined(M2PA_VERSION_DRAFT4_9)
	if (iut_fsn || iut_bsn)
		printf("%23.23s  <--[%04x, %04x]---  %-23.23s\n", l, iut_bsn, iut_fsn, r);
	else
#endif
		printf("%23.23s  <-----------------  %-23.23s\n", l, r);
	FFLUSH(stdout);
}

static int pt_decode_data(void)
{
	int ret;
	if (debug && verbose) {
		printf("pt decode data...       .    .        .    .                        \n");
		FFLUSH(stdout);
	}
	switch (((uint32_t *) pt_buf)[0]) {
	case M2PA_STATUS_MESSAGE:
	{
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)||defined(M2PA_VERSION_DRAFT6_9)||defined(M2PA_VERSION_DRAFT7)
		uint mystatus = ((uint32_t *) pt_buf)[2];
#elif defined(M2PA_VERSION_DRAFT4)||defined(M2PA_VERSION_DRAFT4_1)
		uint mystatus = ((uint32_t *) pt_buf)[3];
#elif defined(M2PA_VERSION_DRAFT4_9)||defined(M2PA_VERSION_DRAFT5)||defined(M2PA_VERSION_DRAFT5_1)||defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)
		uint mystatus = ((uint32_t *) pt_buf)[4];
#else
#error "Draft poorly defined."
#endif
		switch (mystatus) {
		case M2PA_STATUS_OUT_OF_SERVICE:
			ret = OUT_OF_SERVICE;
			break;
		case M2PA_STATUS_IN_SERVICE:
			ret = IN_SERVICE;
			break;
		case M2PA_STATUS_PROVING_NORMAL:
			ret = PROVING_NORMAL;
			break;
		case M2PA_STATUS_PROVING_EMERGENCY:
			ret = PROVING_EMERG;
			break;
		case M2PA_STATUS_ALIGNMENT:
			ret = ALIGNMENT;
			break;
		case M2PA_STATUS_PROCESSOR_OUTAGE:
			ret = PROCESSOR_OUTAGE;
			break;
		case M2PA_STATUS_BUSY:
			ret = BUSY;
			break;
		case M2PA_STATUS_PROCESSOR_OUTAGE_ENDED:
			ret = PROCESSOR_ENDED;
			break;
		case M2PA_STATUS_BUSY_ENDED:
			ret = BUSY_ENDED;
			break;
#if defined(M2PA_VERSION_DRAFT4)||defined(M2PA_VERSION_DRAFT4_1)||defined(M2PA_VERSION_DRAFT4_9)
		case M2PA_STATUS_NONE:
			ret = ACK;
			break;
#endif
		default:
		{
			int i;
			printf("ERROR: invalid status = %d\n", mystatus);
			printf("pt_buf =");
			for (i = 0; i < 20; i++) {
				printf(" %02x", pt_buf[i]);
			}
			printf("\n");
			ret = INVALID_STATUS;
			break;
		}
		}
		break;
	}
#if defined(M2PA_VERSION_DRAFT3_1)
	case M2PA_ACK_MESSAGE:
		ret = ACK;
		break;
#endif
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
	case M2PA_PROVING_MESSAGE:
		ret = PROVING;
		break;
#endif
	case M2PA_DATA_MESSAGE:
#if defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)||defined(M2PA_VERSION_DRAFT6_9)
		if (ntohl(((uint32_t *) pt_buf)[1]) == 4 * sizeof(uint32_t)) {
			ret = ACK;
			break;
		}
#endif
		ret = DATA;
		break;
	default:
		ret = FAILURE;
		break;
	}

	if (ret != oldret) {
		if ((ret == DATA || ret == ACK) && !expand)
			cntmsg++;
		else
			cntret = 0;
		oldret = ret;
		if (verbose) {
			if (cntret) {
				printf
				    ("    Ct=%5d                                                        \n",
				     cntret + 1);
				FFLUSH(stdout);
			}
		}
		cntret = 0;
	} else if (!expand)
		cntret++;
#if 0
	if (show_fisus || ret != FISU || verbose) {
		if (ret != oldret || oldisb != (((iut_bib | iut_bsn) << 8) | (iut_fib | iut_fsn))) {
//                      if ( oldisb == (((iut_bib|iut_bsn)<<8)|(iut_fib|iut_fsn)) &&
//                                      ( ( ret == FISU && oldret == DATA ) || ( ret == DATA && oldret == FISU ) ) )
//                      {
//                              if ( ret == DATA && !expand )
//                                      cntmsg++;
//                      }
//                      else
			cntret = 0;
			oldret = ret;
			oldisb = ((iut_bib | iut_bsn) << 8) | (iut_fib | iut_fsn);
			if (verbose) {
				if (cntret) {
					printf
					    ("    Ct=%5d                                                        \n",
					     cntret + 1);
					FFLUSH(stdout);
				}
			}
			cntret = 0;
		} else if (!expand)
			cntret++;
	}
#endif
	if (!cntret) {
#if defined(M2PA_VERSION_DRAFT4)||defined(M2PA_VERSION_DRAFT4_1)
		iut_bsn = ntohl(((uint32_t *) pt_buf)[2]) >> 16;
		iut_fsn = ntohl(((uint32_t *) pt_buf)[2]) & 0xffff;
#else
		iut_bsn = ntohl(((uint32_t *) pt_buf)[2]);
		iut_fsn = ntohl(((uint32_t *) pt_buf)[3]);
#endif
		switch (ret) {
		case IN_SERVICE:
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			iut_printf("", "IN-SERVICE");
#else
			iut_printf("", "READY");
#endif
			return ret;
		case ALIGNMENT:
			iut_printf("", "ALIGNMENT");
			return ret;
		case PROVING_NORMAL:
			iut_printf("", "PROVING-NORMAL");
			return ret;
		case PROVING_EMERG:
			iut_printf("", "PROVING-EMERGENCY");
			return ret;
		case OUT_OF_SERVICE:
			iut_printf("", "OUT-OF-SERVICE");
			return ret;
		case PROCESSOR_OUTAGE:
			iut_printf("", "PROCESSOR-OUTAGE");
			return ret;
		case BUSY:
			iut_printf("", "BUSY");
			return ret;
		case INVALID_STATUS:
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)||defined(M2PA_VERSION_DRAFT6_9)||defined(M2PA_VERSION_DRAFT7)
			printf
			    ("                         <-----------------  [INVALID STATUS %5u] \n",
			     ntohl(((uint32_t *) pt_buf)[2]));
#elif defined(M2PA_VERSION_DRAFT4)||defined(M2PA_VERSION_DRAFT4_1)
			printf
			    ("                         <--[%04x, %04x]---  [INVALID STATUS %5u] \n",
			     iut_bsn, iut_fsn, ntohl(((uint32_t *) pt_buf)[3]));
#elif defined(M2PA_VERSION_DRAFT4_9)||defined(M2PA_VERSION_DRAFT5)||defined(M2PA_VERSION_DRAFT5_1)||defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)
			printf
			    ("                         <--[%04x, %04x]---  [INVALID STATUS %5u] \n",
			     iut_bsn, iut_fsn, ntohl(((uint32_t *) pt_buf)[4]));
#else
#error "Poorly defined version."
#endif
			FFLUSH(stdout);
			return ret;
		case PROCESSOR_ENDED:
			iut_printf("", "PROCESSOR-OUTAGE-ENDED");
			return ret;
		case BUSY_ENDED:
			iut_printf("", "BUSY-ENDED");
			return ret;
#if defined(M2PA_VERSION_DRAFT4)||defined(M2PA_VERSION_DRAFT4_1)||defined(M2PA_VERSION_DRAFT4_9)||defined(M2PA_VERSION_DRAFT5)||defined(M2PA_VERSION_DRAFT5_1)
		case ACK:
			iut_printf("", "IN-SERVICE");
			return ret;
#elif defined(M2PA_VERSION_DRAFT3_1)
		case ACK:
			printf
			    ("                         <-----------------  ACK [%5u msgs]       \n",
			     ntohl(((uint32_t *) pt_buf)[2]));
			FFLUSH(stdout);
			return ret;
#elif defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)||defined(M2PA_VERSION_DRAFT6_9)||defined(M2PA_VERSION_DRAFT7)
		case ACK:
			printf
			    ("                         <--[%04x, %04x]---  DATA-ACK               \n",
			     iut_bsn, iut_fsn);
			FFLUSH(stdout);
			return ret;
#endif
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
		case PROVING:
			printf
			    ("                         <-----------------  PROVING [%5u bytes]  \n",
			     ntohl(((uint32_t *) pt_buf)[1]) - 2 * sizeof(uint32_t));
			FFLUSH(stdout);
			return ret;
#endif
		case DATA:
#if defined(M2PA_VERSION_DRAFT4)||defined(M2PA_VERSION_DRAFT4_1)||defined(M2PA_VERSION_DRAFT4_9)
			pt_bsn = iut_fsn;
#endif
			if (show_msus || verbose) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
				printf
				    ("                         <-----------------  DATA [%5u bytes]     \n",
				     iut_bsn, iut_fsn, ntohl(((uint32_t *) pt_buf)[1]) - 2 * sizeof(uint32_t));
#else
				printf
				    ("                         <--[%04x, %04x]---  DATA [%5u bytes]     \n",
				     iut_bsn, iut_fsn, ntohl(((uint32_t *) pt_buf)[1]) - 4 * sizeof(uint32_t));
#endif
				FFLUSH(stdout);
				return ret;
			}
			return ret;
		default:
			printf("                         <-----------------  ????????               \n");
			FFLUSH(stdout);
			return ret;
		}
	}
	return ret;
}

/*
 *  -------------------------------------------------------------------------
 *
 *  Decode ctrl at Protocol Tester
 *
 *  -------------------------------------------------------------------------
 */
static int pt_decode_msg(unsigned char *buf)
{
	union primitives *p = (union primitives *) buf;
	if (debug && verbose)
		printf("pt decode msg...         <-----------------                         \n");
	switch (p->npi.type) {
	case N_DATA_IND:
		if (verbose) {
			printf("              !data ind                                             \n");
			FFLUSH(stdout);
		}
		return pt_decode_data();
	case N_EXDATA_IND:
		if (verbose) {
			printf("            !exdata ind                                             \n");
			FFLUSH(stdout);
		}
		return pt_decode_data();
	case N_CONN_IND:
		if (verbose) {
			printf("              !conn ind                                             \n");
			FFLUSH(stdout);
		}
		pt_seq = p->npi.conn_ind.SEQ_number;
		return UNKNOWN;
	case N_CONN_CON:
		if (verbose) {
			printf("              !conn con                                             \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_DISCON_IND:
		if (verbose) {
			printf("            !discon ind                                             \n");
			FFLUSH(stdout);
		}
		return DISCON_IND;
	case N_INFO_ACK:
		if (verbose) {
			printf("              !info ack                                             \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_BIND_ACK:
		if (verbose) {
			printf("              !bind ack                                             \n");
			printf("    cons = %lu\n", p->npi.bind_ack.CONIND_number);
			printf("    tok  = %lx\n", p->npi.bind_ack.TOKEN_value);
			printf("    alen = %lu\n", p->npi.bind_ack.ADDR_length);
			if (p->npi.bind_ack.ADDR_length == 14) {
				addr_t *a = (addr_t *) (buf + p->npi.bind_ack.ADDR_offset);
				printf("    port = %u\n", ntohs(a->port));
				printf("    add1 = %d.%d.%d.%d\n", (a->addr[0] >> 0) & 0xff,
				       (a->addr[0] >> 8) & 0xff, (a->addr[0] >> 16) & 0xff,
				       (a->addr[0] >> 24) & 0xff);
				printf("    add2 = %d.%d.%d.%d\n", (a->addr[1] >> 0) & 0xff,
				       (a->addr[1] >> 8) & 0xff, (a->addr[1] >> 16) & 0xff,
				       (a->addr[1] >> 24) & 0xff);
				printf("    add3 = %d.%d.%d.%d\n", (a->addr[2] >> 0) & 0xff,
				       (a->addr[2] >> 8) & 0xff, (a->addr[2] >> 16) & 0xff,
				       (a->addr[2] >> 24) & 0xff);
			}
			FFLUSH(stdout);
		}
		pt_tok = p->npi.bind_ack.TOKEN_value;
		return BIND_ACK;
	case N_ERROR_ACK:
		if (verbose) {
			printf("             !error ack                                             \n");
			FFLUSH(stdout);
		}
		return ERROR_ACK;
	case N_OK_ACK:
		if (verbose) {
			printf("                !ok ack                                             \n");
			FFLUSH(stdout);
		}
		return OK_ACK;
	case N_UNITDATA_IND:
		if (verbose) {
			printf("          !unitdata ind                                             \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_UDERROR_IND:
		if (verbose) {
			printf("           !uderror ind                                             \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_DATACK_IND:
		if (verbose) {
			printf("            !datack ind                                             \n");
			FFLUSH(stdout);
		}
#if defined(M2PA_VERSION_DRAFT3_1)
		return ACK;
#else
		return UNKNOWN;
#endif
	case N_RESET_IND:
		if (verbose) {
			printf("             !reset ind                                             \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_RESET_CON:
		if (verbose) {
			printf("             !reset con                                             \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	default:
		printf("         !(unknown %3ld)                                             \n", p->npi.type);
		FFLUSH(stdout);
		return UNKNOWN;
	}
}

/*
 *  -------------------------------------------------------------------------
 *
 *  Decode data at Implementation Under Test
 *
 *  -------------------------------------------------------------------------
 */
static int iut_decode_data(void)
{
	printf("                                             !msu                   \n");
	FFLUSH(stdout);
	return IUT_DATA;
}

/*
 *  -------------------------------------------------------------------------
 *
 *  Decode ctrl at Implementation Under Test
 *
 *  -------------------------------------------------------------------------
 */
static int iut_decode_msg(unsigned char *buf)
{
	char *reason;
	union primitives *p = (union primitives *) buf;
	if (p->sl.sl_primitive != oldprm) {
		oldprm = p->sl.sl_primitive;
		cntprm = 0;
	} else if (!expand)
		cntprm++;
	switch (p->prim) {
	case SL_REMOTE_PROCESSOR_OUTAGE_IND:
		if (!cntprm) {
			printf("                                             !rpo                   \n");
			FFLUSH(stdout);
		}
		return IUT_RPO;
	case SL_REMOTE_PROCESSOR_RECOVERED_IND:
		if (!cntprm) {
			printf("                                             !rpr                   \n");
			FFLUSH(stdout);
		}
		return IUT_RPR;
	case SL_IN_SERVICE_IND:
		printf("                                             !in service            \n");
		FFLUSH(stdout);
		return IUT_IN_SERVICE;
	case SL_OUT_OF_SERVICE_IND:
		switch (p->sl.out_of_service_ind.sl_reason) {
		case SL_FAIL_UNSPECIFIED:
			reason = "unspec";
			break;
		case SL_FAIL_CONG_TIMEOUT:
			reason = "T6";
			break;
		case SL_FAIL_ACK_TIMEOUT:
			reason = "T7";
			break;
		case SL_FAIL_ABNORMAL_BSNR:
			reason = "BSNR";
			break;
		case SL_FAIL_ABNORMAL_FIBR:
			reason = "FIBR";
			break;
		case SL_FAIL_SUERM_EIM:
			reason = "SUERM";
			break;
		case SL_FAIL_ALIGNMENT_NOT_POSSIBLE:
			reason = "AERM";
			break;
		case SL_FAIL_RECEIVED_SIO:
			reason = "SIO";
			break;
		case SL_FAIL_RECEIVED_SIN:
			reason = "SIN";
			break;
		case SL_FAIL_RECEIVED_SIE:
			reason = "SIE";
			break;
		case SL_FAIL_RECEIVED_SIOS:
			reason = "SIOS";
			break;
		case SL_FAIL_T1_TIMEOUT:
			reason = "T1";
			break;
		default:
			reason = "???";
			break;
		}
		printf("                                             !out of service(%s)\n", reason);
		FFLUSH(stdout);
		return IUT_OUT_OF_SERVICE;
	case SL_PDU_IND:
		printf("                                             !msu                   \n");
		FFLUSH(stdout);
		return IUT_DATA;
	case SL_LINK_CONGESTED_IND:
		printf("                                             !congested             \n");
		FFLUSH(stdout);
		return UNKNOWN;
	case SL_LINK_CONGESTION_CEASED_IND:
		printf("                                             !congestion ceased     \n");
		FFLUSH(stdout);
		return UNKNOWN;
	case SL_RETRIEVED_MESSAGE_IND:
		printf("                                             !retrieved message     \n");
		FFLUSH(stdout);
		return UNKNOWN;
	case SL_RETRIEVAL_COMPLETE_IND:
		printf("                                             !retrieval compelte    \n");
		FFLUSH(stdout);
		return UNKNOWN;
	case SL_RB_CLEARED_IND:
		printf("                                             !rb cleared            \n");
		FFLUSH(stdout);
		return UNKNOWN;
	case SL_BSNT_IND:
		printf("                                             !bsnt                  \n");
		FFLUSH(stdout);
		return UNKNOWN;
	case SL_RTB_CLEARED_IND:
		printf("                                             !rtb cleared           \n");
		FFLUSH(stdout);
		return UNKNOWN;
	case LMI_INFO_ACK:
		if (verbose) {
			printf("                                             !info ack              \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case LMI_OK_ACK:
		if (verbose) {
			printf("                                             !ok ack                \n");
			FFLUSH(stdout);
		}
		return OK_ACK;
	case LMI_ERROR_ACK:
		if (verbose) {
			printf("                                             !error ack             \n");
			FFLUSH(stdout);
		}
		return ERROR_ACK;
	case LMI_ENABLE_CON:
		if (verbose) {
			printf("                                             !enable con            \n");
			FFLUSH(stdout);
		}
		return ENABLE_CON;
	case LMI_DISABLE_CON:
		if (verbose) {
			printf("                                             !disable con           \n");
			FFLUSH(stdout);
		}
		return DISABLE_CON;
	case LMI_ERROR_IND:
		if (verbose) {
			printf("                                             !error ind             \n");
			FFLUSH(stdout);
		}
		return ERROR_IND;
	case LMI_STATS_IND:
		if (verbose) {
			printf("                                             !stats ind             \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case LMI_EVENT_IND:
		if (verbose) {
			printf("                                             !event ind             \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_CONN_IND:
		if (verbose) {
			printf("                                             !conn ind              \n");
			FFLUSH(stdout);
		}
		iut_seq = p->npi.conn_ind.SEQ_number;
		return UNKNOWN;
	case N_CONN_CON:
		if (verbose) {
			printf("                                             !conn con              \n");
			FFLUSH(stdout);
		}
		return CONN_CON;
	case N_DISCON_IND:
		if (verbose) {
			printf("                                             !discon ind            \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_INFO_ACK:
		if (verbose) {
			printf("                                             !info ack              \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_BIND_ACK:
		if (verbose) {
			printf("                                             !bind ack              \n");
			printf("                                                   cons = %lu\n",
			       p->npi.bind_ack.CONIND_number);
			printf("                                                   tok  = %lx\n",
			       p->npi.bind_ack.TOKEN_value);
			printf("                                                   alen = %lu\n",
			       p->npi.bind_ack.ADDR_length);
			if (p->npi.bind_ack.ADDR_length == 14) {
				addr_t *a = (addr_t *) (buf + p->npi.bind_ack.ADDR_offset);
				printf
				    ("                                                   port = %u\n",
				     ntohs(a->port));
				printf
				    ("                                                   add1 = %d.%d.%d.%d\n",
				     (a->addr[0] >> 0) & 0xff, (a->addr[0] >> 8) & 0xff,
				     (a->addr[0] >> 16) & 0xff, (a->addr[0] >> 24) & 0xff);
				printf
				    ("                                                   add2 = %d.%d.%d.%d\n",
				     (a->addr[1] >> 0) & 0xff, (a->addr[1] >> 8) & 0xff,
				     (a->addr[1] >> 16) & 0xff, (a->addr[1] >> 24) & 0xff);
				printf
				    ("                                                   add3 = %d.%d.%d.%d\n",
				     (a->addr[2] >> 0) & 0xff, (a->addr[2] >> 8) & 0xff,
				     (a->addr[2] >> 16) & 0xff, (a->addr[2] >> 24) & 0xff);
			}
			FFLUSH(stdout);
		}
		iut_tok = p->npi.bind_ack.TOKEN_value;
		return BIND_ACK;
	case N_ERROR_ACK:
		if (verbose) {
			printf("                                             !error ack             \n");
			FFLUSH(stdout);
		}
		return ERROR_ACK;
	case N_OK_ACK:
		if (verbose) {
			printf("                                             !ok ack                \n");
			FFLUSH(stdout);
		}
		return OK_ACK;
	case N_UNITDATA_IND:
		if (verbose) {
			printf("                                             !unitdata ind          \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_UDERROR_IND:
		if (verbose) {
			printf("                                             !uderror ind           \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_DATACK_IND:
		if (verbose) {
			printf("                                             !datack ind            \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_RESET_IND:
		if (verbose) {
			printf("                                             !reset ind             \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_RESET_CON:
		if (verbose) {
			printf("                                             !reset con             \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	default:
		printf("                                             !(unknown %5ld)       \n",
		       p->sl.sl_primitive);
		FFLUSH(stdout);
		return UNKNOWN;
	}
}

/*
 *  -------------------------------------------------------------------------
 *
 *  Decode data at Management Stream
 *
 *  -------------------------------------------------------------------------
 */
static int mgm_decode_data(void)
{
	printf("                 !data |                                            \n");
	FFLUSH(stdout);
	return UNKNOWN;
}

/*
 *  -------------------------------------------------------------------------
 *
 *  Decode ctrl at Management Stream
 *
 *  -------------------------------------------------------------------------
 */
static int mgm_decode_msg(unsigned char *buf)
{
	union primitives *p = (union primitives *) buf;
	if (p->npi.type != oldmgm) {
		oldmgm = p->npi.type;
		cntmgm = 0;
	} else if (!expand)
		cntmgm++;
	switch (p->prim) {
	case N_CONN_IND:
		if (verbose) {
			printf("             !conn ind |                                            \n");
			FFLUSH(stdout);
		}
		mgm_seq = p->npi.conn_ind.SEQ_number;
		return CONN_IND;
	case N_CONN_CON:
		if (verbose) {
			printf("             !conn con |                                            \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_DISCON_IND:
		if (verbose) {
			printf("           !discon ind |                                            \n");
			FFLUSH(stdout);
		}
		return DISCON_IND;
	case N_INFO_ACK:
		if (verbose) {
			printf("             !info ack |                                            \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_BIND_ACK:
		if (verbose) {
			printf("             !bind ack |                                            \n");
			printf("    cons = %lu\n", p->npi.bind_ack.CONIND_number);
			printf("    tok  = %lx\n", p->npi.bind_ack.TOKEN_value);
			printf("    alen = %lu\n", p->npi.bind_ack.ADDR_length);
			if (p->npi.bind_ack.ADDR_length == 14) {
				addr_t *a = (addr_t *) (buf + p->npi.bind_ack.ADDR_offset);
				printf("    port = %u\n", ntohs(a->port));
				printf("    add1 = %d.%d.%d.%d\n", (a->addr[0] >> 0) & 0xff,
				       (a->addr[0] >> 8) & 0xff, (a->addr[0] >> 16) & 0xff,
				       (a->addr[0] >> 24) & 0xff);
				printf("    add2 = %d.%d.%d.%d\n", (a->addr[1] >> 0) & 0xff,
				       (a->addr[1] >> 8) & 0xff, (a->addr[1] >> 16) & 0xff,
				       (a->addr[1] >> 24) & 0xff);
				printf("    add3 = %d.%d.%d.%d\n", (a->addr[2] >> 0) & 0xff,
				       (a->addr[2] >> 8) & 0xff, (a->addr[2] >> 16) & 0xff,
				       (a->addr[2] >> 24) & 0xff);
			}
			FFLUSH(stdout);
		}
		mgm_tok = p->npi.bind_ack.TOKEN_value;
		return BIND_ACK;
	case N_ERROR_ACK:
		if (verbose) {
			printf("            !error ack |                                            \n");
			FFLUSH(stdout);
		}
		return ERROR_ACK;
	case N_OK_ACK:
		if (verbose) {
			printf("               !ok ack |                                            \n");
			FFLUSH(stdout);
		}
		return OK_ACK;
	case N_UNITDATA_IND:
		if (verbose) {
			printf("         !unitdata ind |                                            \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_UDERROR_IND:
		if (verbose) {
			printf("          !uderror ind |                                            \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_DATACK_IND:
		if (verbose) {
			printf("           !datack ind |                                            \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_RESET_IND:
		if (verbose) {
			printf("            !reset ind |                                            \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	case N_RESET_CON:
		if (verbose) {
			printf("            !reset con |                                            \n");
			FFLUSH(stdout);
		}
		return UNKNOWN;
	default:
		printf("      !(uninown %5ld) |                                            \n", p->npi.type);
		FFLUSH(stdout);
		return UNKNOWN;
	}
}

/*
 *  =========================================================================
 *
 *  EVENT HANDLING
 *
 *  =========================================================================
 */
static int show_timeout = 0;
/*
 *  -------------------------------------------------------------------------
 *
 *  Wait for message or timeout.
 *
 *  -------------------------------------------------------------------------
 */
static int wait_event(int wait)
{
	while (1) {
		struct pollfd pfd[] = {
			{pt_fd, POLLIN | POLLPRI, 0},
			{iut_fd, POLLIN | POLLPRI, 0},
			{mgm_fd, POLLIN | POLLPRI, 0}
		};
		if (debug && verbose) {
			float t, m;
			struct timeval now;
			static long reference = 0;
			gettimeofday(&now, NULL);
			if (!reference)
				reference = now.tv_sec;
			t = (now.tv_sec - reference);
			m = now.tv_usec;
			m = m / 1000000;
			t += m;
			printf("%11.6g\n", t);
			FFLUSH(stdout);
		}
		if (timer_timeout) {
			timer_timeout = 0;
			if (show_timeout || verbose) {
				printf("                         -----timeout------                         \n");
				FFLUSH(stdout);
				if (show_timeout)
					show_timeout--;
			}
			return TIMEOUT;
		}
		if (debug && verbose) {
			printf("                         ......polling.....                         \n");
			FFLUSH(stdout);
		}
		switch (poll(pfd, 3, wait)) {
		case -1:
			if (debug && verbose) {
				printf("                         = = = ERROR = = =                          \n");
				FFLUSH(stdout);
			}
			break;
		case 0:
			if (debug && verbose) {
				printf("                         + + +nothing + + +                         \n");
				FFLUSH(stdout);
			}
			return NO_MSG;
		case 1:
		case 2:
		case 3:
			if (debug && verbose) {
				printf("                         ^^^^^^polled^^^^^^                         \n");
				FFLUSH(stdout);
			}
			if (pfd[0].revents & (POLLIN | POLLPRI | POLLERR | POLLHUP)) {
				int ret = UNKNOWN;
				int flags = 0;
				unsigned char cbuf[BUFSIZE];
				struct strbuf ctrl = { BUFSIZE, 0, cbuf }, data = {
				BUFSIZE, 0, pt_buf};
				if (debug && verbose) {
					printf
					    ("pt getmsg...                                                        \n");
					FFLUSH(stdout);
				}
				if (getmsg(pt_fd, &ctrl, &data, &flags) < 0) {
					printf("****ERROR: pt getmsg failed\n");
					printf("           %s: %s\n", __FUNCTION__, strerror(errno));
					FFLUSH(stdout);
					return NO_MSG;
				} else {
					if (debug && verbose) {
						printf
						    ("pt gotmsg... [%2d,%2d]                                                \n",
						     ctrl.len, data.len);
						FFLUSH(stdout);
					}
					if (ctrl.len > 0 && (ret = pt_decode_msg(ctrl.buf)) != UNKNOWN)
						return ret;
					if (data.len > 0 && (ret = pt_decode_data()) != UNKNOWN)
						return ret;
				}
			}
			if (pfd[1].revents & (POLLIN | POLLPRI | POLLERR | POLLHUP)) {
				int ret = UNKNOWN;
				int flags = 0;
				unsigned char cbuf[BUFSIZE];
				struct strbuf ctrl = { BUFSIZE, 0, cbuf }, data = {
				BUFSIZE, 0, iut_buf};
				if (debug && verbose) {
					printf
					    ("                                             iut getmsg             \n");
					FFLUSH(stdout);
				}
				if (getmsg(iut_fd, &ctrl, &data, &flags) < 0) {
					printf
					    ("                                   ****ERROR: iut getmsg failed\n");
					printf
					    ("                                              %s: %s\n",
					     __FUNCTION__, strerror(errno));
					FFLUSH(stdout);
					return NO_MSG;
				} else {
					if (debug && verbose) {
						printf
						    ("                                             iut gotmsg [%2d,%2d]     \n",
						     ctrl.len, data.len);
						FFLUSH(stdout);
					}
					if (ctrl.len > 0 && (ret = iut_decode_msg(ctrl.buf)) != UNKNOWN)
						return ret;
					if (data.len > 0 && (ret = iut_decode_data()) != UNKNOWN)
						return ret;
				}
			}
			if (pfd[2].revents & (POLLIN | POLLPRI | POLLERR | POLLHUP)) {
				int ret = UNKNOWN;
				int flags = 0;
				unsigned char cbuf[BUFSIZE];
				struct strbuf ctrl = { BUFSIZE, 0, cbuf }, data = {
				BUFSIZE, 0, mgm_buf};
				if (debug && verbose) {
					printf
					    ("  mgm getmsg...                                                     \n");
					FFLUSH(stdout);
				}
				if (getmsg(mgm_fd, &ctrl, &data, &flags) < 0) {
					printf("  ****ERROR: mgm getmsg failed\n");
					printf("             %s: %s\n", __FUNCTION__, strerror(errno));
					FFLUSH(stdout);
					return NO_MSG;
				} else {
					if (debug && verbose) {
						printf
						    ("  mgm gotmsg... [%2d,%2d]                                             \n",
						     ctrl.len, data.len);
						FFLUSH(stdout);
					}
					if (ctrl.len > 0 && (ret = mgm_decode_msg(ctrl.buf)) != UNKNOWN)
						return ret;
					if (data.len > 0 && (ret = mgm_decode_data()) != UNKNOWN)
						return ret;
				}
			}
		default:
			break;
		}
	}
}
static int get_event(void)
{
	return wait_event(-1);
}

/*
 *  =========================================================================
 *
 *  The test cases...
 *
 *  =========================================================================
 */
#if 0
static int check_snibs(unsigned char bsnib, unsigned char fsnib)
{
	printf("                 check b/f sn/ib:  ---> (%02x/%02x)\n", bsnib, fsnib);
	FFLUSH(stdout);
	if ((iut_bib | iut_bsn) == bsnib && (iut_fib | iut_fsn) == fsnib)
		return SUCCESS;
	return FAILURE;
}
#endif

static int test_1_1a(void)
{
	for (;;) {
		switch (state) {
		case 0:
			send(POWER_ON);
			send(OUT_OF_SERVICE);
			signal(POWER_ON);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_1b(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
			case NO_MSG:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_2(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return INCONCLUSIVE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case ALIGNMENT:
				start_tt(iutconf.sl.t2 * 20);
				beg_time = milliseconds(t2);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				return check_time("T2  ", beg_time, timer[t2].lo, timer[t2].hi);
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_3(void)
{
	for (;;) {
		switch (state) {
		case 0:
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 2;
				break;
			default:
				return INCONCLUSIVE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				state = 3;
				break;
			default:
				return INCONCLUSIVE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				start_tt(iutconf.sl.t3 * 20);
				beg_time = milliseconds(t3);
				state = 4;
				break;
			default:
				return INCONCLUSIVE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				return check_time("T3  ", beg_time, timer[t3].lo, timer[t3].hi);
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_4(void)
{
	for (;;) {
		switch (state) {
		case 0:
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 2;
				break;
			default:
				return INCONCLUSIVE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				beg_time = milliseconds(t4n);
				state = 3;
				break;
			default:
				return INCONCLUSIVE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 4;
				break;
			default:
				return INCONCLUSIVE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				if (check_time("T4  ", beg_time, timer[t4n].lo, timer[t4n].hi))
					return FAILURE;
				start_tt(iutconf.sl.t1 * 20);
				beg_time = milliseconds(t1);
				state = 5;
				break;
			default:
				return FAILURE;
			}
			break;
		case 5:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				return check_time("T1  ", beg_time, timer[t1].lo, timer[t1].hi);
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_5a(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
			case IN_SERVICE:
				send(IN_SERVICE);
				start_tt(1000);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_5b(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
			case IN_SERVICE:
				send(IN_SERVICE);
				start_tt(1000);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_6(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return INCONCLUSIVE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				send(DATA);
				start_tt(1000);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case ACK:
			case IUT_IN_SERVICE:
			case IUT_DATA:
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_7(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 10 / 2);
				show_timeout = 1;
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case TIMEOUT:
				start_tt(iutconf.sl.t4n * 20);
				send(ALIGNMENT);
				beg_time = milliseconds(t4n);
				send(PROVING_NORMAL);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				return check_time("T4  ", beg_time, timer[t4n].lo, timer[t4n].hi);
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_8a(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(LPO);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
			case IUT_RPR:
				break;
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case PROCESSOR_OUTAGE:
				send(IN_SERVICE);
				start_tt(1000);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
			case IUT_RPR:
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_8b(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				send(LPO);
				send(START);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				send(PROCESSOR_OUTAGE);
				start_tt(1000);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_RPO:
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_9a(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(LPO);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case PROCESSOR_OUTAGE:
				start_tt(1000);
				send(DATA);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
			case IUT_RPR:
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_9b(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				send(LPO);
				send(START);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 10);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				signal(SEND_MSU);
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case IUT_RPO:
				break;
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
			case TIMEOUT:
			case IN_SERVICE:
			case DATA:
				start_tt(1000);
				send(PROCESSOR_OUTAGE);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_RPO:
				break;
			case DATA:
				send(PROCESSOR_OUTAGE);
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_10(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(LPO);
				signal(LPR);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				start_tt(1000);
				send(IN_SERVICE);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_11(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				send(LPO);
				signal(LPO);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case PROCESSOR_OUTAGE:
				send(PROCESSOR_OUTAGE);
				start_tt(1000);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_RPO:
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_12a(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(LPO);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case PROCESSOR_OUTAGE:
				send(STOP);
				start_tt(1000);
				send(OUT_OF_SERVICE);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_OUT_OF_SERVICE:
				break;
			case OUT_OF_SERVICE:
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_12b(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				send(LPO);
				send(START);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				signal(STOP);
				send(IN_SERVICE);
				start_tt(1000);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				send(OUT_OF_SERVICE);
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_13(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(LPO);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case PROCESSOR_OUTAGE:
				start_tt(1000);
				send(ALIGNMENT);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case PROCESSOR_OUTAGE:
				send(ALIGNMENT);
				break;
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				send(OUT_OF_SERVICE);
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_14(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				signal(LPO);
				start_tt(iutconf.sl.t4n * 10 / 2);
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case TIMEOUT:
				signal(LPR);
				start_tt(iutconf.sl.t4n * 10 / 2 + 1000);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
				break;
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				send(IN_SERVICE);
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_15(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				signal(LPO);
				start_tt(1000);
				send(IN_SERVICE);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
			case IUT_RPR:
				break;
			case PROCESSOR_OUTAGE:
				start_tt(5000);
				state = 5;
				break;
			default:
				return FAILURE;
			}
			break;
		case 5:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
			case IUT_RPR:
				break;	/* stupid ITU-T SDLs */
			case TIMEOUT:
				signal(LPR);
				start_tt(5000);
				state = 6;
				break;
			default:
				return FAILURE;
			}
			break;
		case 6:
			switch ((event = get_event())) {
			case PROCESSOR_ENDED:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_16(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(LPO);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case PROCESSOR_OUTAGE:
				start_tt(iutconf.sl.t1 * 20);
				beg_time = milliseconds(t1);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
				break;
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				return check_time("T1  ", beg_time, timer[t1].lo, timer[t1].hi);
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_17(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(PROVING_NORMAL);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				beg_time = dual_milliseconds(t3, t4n);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				return check_time("T3,4", beg_time, timer[t4n].lo, timer[t3].hi + timer[t4n].hi);
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_18(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(EMERG);
				signal(CEASE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				beg_time = milliseconds(t4n);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				return check_time("T4  ", beg_time, timer[t4n].lo, timer[t4n].hi);
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_19(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				signal(EMERG);
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4e * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_EMERG:
				send(PROVING_EMERG);
				beg_time = milliseconds(t4e);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				return check_time("T4  ", beg_time, timer[t4e].lo, timer[t4e].hi);
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_20(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				signal(EMERG);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case PROVING_EMERG:
				beg_time = milliseconds(t4n);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				return check_time("T4  ", beg_time, timer[t4e].lo, timer[t4e].hi);
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_21(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(EMERG);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4e * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_EMERG:
				send(PROVING_EMERG);
				beg_time = milliseconds(t4e);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				return check_time("T4  ", beg_time, timer[t4e].lo, timer[t4e].hi);
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_22(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				send(EMERG);
				send(START);
				send(ALIGNMENT);
				signal(START);
				start_tt(iutconf.sl.t4e * 20);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(PROVING_EMERG);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				beg_time = milliseconds(t4e);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				return check_time("T4  ", beg_time, timer[t4e].lo, timer[t4e].hi);
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_23(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				signal(EMERG);
				start_tt(iutconf.sl.t4e * 20);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case PROVING_EMERG:
				beg_time = milliseconds(t4e);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_EMERG:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				return check_time("T4  ", beg_time, timer[t4e].lo, timer[t4e].hi);
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_24(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(EMERG);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(PROVING_EMERG);
				start_tt(iutconf.sl.t4e * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_EMERG:
				beg_time = milliseconds(t4e);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_EMERG:
				send(PROVING_EMERG);
				break;
#endif
			case IN_SERVICE:
				return check_time("T4  ", beg_time, timer[t4e].lo, timer[t4e].hi);
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_25(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				show_timeout = 1;
				start_tt(iutconf.sl.t2 * 10 - 200);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				break;
			case TIMEOUT:
				signal(STOP);
				start_tt(1000);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_26(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t3 * 8);	/* 80% of T3 */
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				break;
			case TIMEOUT:
				signal(STOP);
				start_tt(iutconf.sl.t4n * 10);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_27(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(LPO);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case PROCESSOR_OUTAGE:
				signal(STOP);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_28(void)
{
	for (;;) {
		switch (state) {
		case 0:
			send(ALIGNMENT);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_29a(void)
{
	for (;;) {
		switch (state) {
		case 0:
			send(STOP);
			send(OUT_OF_SERVICE);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_29b(void)
{
	for (;;) {
		switch (state) {
		case 0:
			signal(STOP);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(OUT_OF_SERVICE);
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_30a(void)
{
	for (;;) {
		switch (state) {
		case 0:
			signal(LPO);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case IUT_RPR:
				break;	/* stupid ITU-T SDLs */
			case PROCESSOR_OUTAGE:
				signal(STOP);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case IUT_RPR:
				break;	/* stupid ITU-T SDLs */
			case OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_30b(void)
{
	for (;;) {
		switch (state) {
		case 0:
			send(LPO);
			state = 1;
			break;
		case 1:
			switch ((event = wait_event(0))) {
			case NO_MSG:
				send(PROCESSOR_OUTAGE);
				send(STOP);
				send(OUT_OF_SERVICE);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = wait_event(SHORT_WAIT))) {
			case IUT_RPO:
				break;	/* stupid ITU-T SDLs */
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_31a(void)
{
	for (;;) {
		switch (state) {
		case 0:
			send(PROCESSOR_OUTAGE);
			signal(STOP);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case IUT_RPO:
				break;
			case OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_31b(void)
{
	for (;;) {
		switch (state) {
		case 0:
			signal(LPO);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case IUT_RPO:
				break;
			case PROCESSOR_OUTAGE:
				send(STOP);
				send(OUT_OF_SERVICE);
				return SUCCESS;
			case IUT_RPR:
				break;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_32a(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				start_tt(iutconf.sl.t4n * 10 / 2);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case TIMEOUT:
				send(STOP);
				send(OUT_OF_SERVICE);
				start_tt(iutconf.sl.t4n * 10 / 2 + 1000);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_32b(void)
{
	for (;;) {
		switch (state) {
		case 0:
			send(OUT_OF_SERVICE);
			send(START);
			signal(START);
			send(ALIGNMENT);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case ALIGNMENT:
				send(PROVING_NORMAL);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				start_tt(iutconf.sl.t4n * 10 / 2);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case TIMEOUT:
				signal(STOP);
				start_tt(iutconf.sl.t4n * 10 / 2 + 1000);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case OUT_OF_SERVICE:
				send(OUT_OF_SERVICE);
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_33(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				send(ALIGNMENT);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_34(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				send(STOP);
				send(OUT_OF_SERVICE);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_1_35(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				send(LPO);
				send(PROCESSOR_OUTAGE);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_RPO:
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_2_1(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				send(ALIGNMENT);
				send(PROVING_NORMAL);
				send(PROVING_EMERG);
				send(PROCESSOR_OUTAGE);
				send(BUSY);
				send(INVALID_STATUS);
				send(PROCESSOR_ENDED);
				send(IN_SERVICE);
				send(BUSY_ENDED);
#if defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)||defined(M2PA_VERSION_DRAFT6_9)
				send(ACK);
#endif
				send(DATA);
				signal(STOP);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				send(IN_SERVICE);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_2_2(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				oldmsg = 0;
				cntmsg = 0;	/* force display OUT_OF_SERVICE */
				send(OUT_OF_SERVICE);
				send(PROCESSOR_OUTAGE);
				send(BUSY);
				send(INVALID_STATUS);
				send(IN_SERVICE);
#if defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)||defined(M2PA_VERSION_DRAFT6_9)
				send(ACK);
#endif
				send(DATA);
				signal(CEASE);
				signal(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				send(IN_SERVICE);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_2_3(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				oldmsg = 0;
				cntmsg = 0;	/* force display ALIGNMENT */
				send(ALIGNMENT);
				send(PROCESSOR_OUTAGE);
				send(BUSY);
				send(INVALID_STATUS);
				send(IN_SERVICE);
				send(PROCESSOR_ENDED);
				send(BUSY_ENDED);
#if defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)||defined(M2PA_VERSION_DRAFT6_9)
				send(ACK);
#endif
				send(DATA);
				signal(CEASE);
				signal(START);
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				send(IN_SERVICE);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_2_4(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				send(PROCESSOR_ENDED);
				send(PROCESSOR_OUTAGE);
				send(BUSY_ENDED);
				send(BUSY);
				send(INVALID_STATUS);
				send(IN_SERVICE);
#if defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)||defined(M2PA_VERSION_DRAFT6_9)
				send(ACK);
#endif
				send(DATA);
				signal(CEASE);
				signal(START);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				send(IN_SERVICE);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_2_5(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				send(BUSY);
				send(INVALID_STATUS);
				signal(EMERG);
				signal(CEASE);
				signal(LPR);
				signal(START);
				send(IN_SERVICE);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_2_6(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(LPO);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case PROCESSOR_OUTAGE:
				send(BUSY);
				send(INVALID_STATUS);
				signal(EMERG);
				signal(CEASE);
				// signal(LPR); // spec says LPR, but it doesn't make sense...
				signal(LPO);
				signal(START);
				send(IN_SERVICE);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
			case IUT_RPR:
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_2_7(void)
{
	for (;;) {
		switch (state) {
		case 0:
			send(INVALID_STATUS);
			signal(EMERG);
			signal(CEASE);
			signal(LPR);
			signal(START);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_2_8(void)
{
	for (;;) {
		switch (state) {
		case 0:
			signal(LPO);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case IUT_RPR:
				break;	/* stupid ITU-T SDLs */
			case PROCESSOR_OUTAGE:
				send(BUSY);
				send(INVALID_STATUS);
				signal(EMERG);
				signal(CEASE);
				signal(START);
				send(IN_SERVICE);
				send(PROCESSOR_ENDED);
				send(BUSY_ENDED);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case IUT_RPR:
				break;	/* stupid ITU-T SDLs */
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_3_1(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case IN_SERVICE:
				if (send(TX_BREAK))
					return INCONCLUSIVE;
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case OK_ACK:
				break;
			case IUT_OUT_OF_SERVICE:	/* FIXME */
				send(TX_MAKE);
				return SUCCESS;
			default:
				send(TX_MAKE);
				return FAILURE;
			}
			break;
		default:
			send(TX_MAKE);
			return SCRIPTERROR;
		}
	}
}
static int test_3_2(void)
{
	for (;;) {
		switch (state) {
		case 0:
			send(BAD_ACK);
			state = 1;
			break;
		case 1:
			switch ((event = wait_event(0))) {
			case NO_MSG:
				oldmsg = 0;
				cntmsg = 0;	/* force display */
				send(BAD_ACK);
				start_tt(1000);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_3_3(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(LPO);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case PROCESSOR_OUTAGE:
				if (send(TX_BREAK))
					return INCONCLUSIVE;
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case OK_ACK:
				break;
			case IUT_OUT_OF_SERVICE:	/* FIXME */
				send(TX_MAKE);
				return SUCCESS;
			default:
				send(TX_MAKE);
				return FAILURE;
			}
			break;
		default:
			send(TX_MAKE);
			return SCRIPTERROR;
		}
	}
}
static int test_3_4(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(LPO);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 20);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
#endif
			case PROCESSOR_OUTAGE:
				send(BAD_ACK);
				start_tt(1000);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = wait_event(0))) {
			case NO_MSG:
				oldmsg = 0;
				cntmsg = 0;	/* force display */
				send(BAD_ACK);
				start_tt(1000);
				state = 5;
				break;
			default:
				return FAILURE;
			}
			break;
		case 5:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_3_5(void)
{
	for (;;) {
		switch (state) {
		case 0:
			if (send(TX_BREAK))
				return INCONCLUSIVE;
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case OK_ACK:
				break;
			case IUT_OUT_OF_SERVICE:	/* FIXME */
				send(TX_MAKE);
				return SUCCESS;
			default:
				send(TX_MAKE);
				return FAILURE;
			}
			break;
		default:
			send(TX_MAKE);
			return SCRIPTERROR;
		}
	}
}
static int test_3_6(void)
{
	for (;;) {
		switch (state) {
		case 0:
			send(BAD_ACK);
			state = 1;
			break;
		case 1:
			switch ((event = wait_event(0))) {
			case NO_MSG:
				oldmsg = 0;
				cntmsg = 0;	/* force display */
				send(BAD_ACK);
				start_tt(1000);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_3_7(void)
{
	for (;;) {
		switch (state) {
		case 0:
			signal(LPO);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case IUT_RPR:
				break;	/* stupid ITU-T SDLs */
			case PROCESSOR_OUTAGE:
				if (send(TX_BREAK))
					return INCONCLUSIVE;
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case OK_ACK:
			case IUT_RPR:
				break;	/* stupid ITU-T SDLs */
			case IUT_OUT_OF_SERVICE:	/* FIXME */
				send(TX_MAKE);
				return SUCCESS;
			default:
				send(TX_MAKE);
				return FAILURE;
			}
			break;
		default:
			send(TX_MAKE);
			return SCRIPTERROR;
		}
	}
}
static int test_3_8(void)
{
	for (;;) {
		switch (state) {
		case 0:
			signal(LPO);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case IUT_RPR:
				break;	/* stupid ITU-T SDLs */
			case PROCESSOR_OUTAGE:
				send(BAD_ACK);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = wait_event(0))) {
			case IUT_RPR:
				break;	/* stupid ITU-T SDLs */
			case NO_MSG:
				oldmsg = 0;
				cntmsg = 0;	/* force display */
				send(BAD_ACK);
				start_tt(1000);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case IUT_RPR:
				break;	/* stupid ITU-T SDLs */
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_4_1(void)
{
	for (;;) {
		switch (state) {
		case 0:
			signal(SEND_MSU);
			signal(SEND_MSU);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
				break;
			case DATA:
				if (++count == 2) {
					signal(LPO);
					send(DATA);
					start_tt(iutconf.sl.t7 * 10 / 2);
					state = 2;
					break;
				}
#if defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)||defined(M2PA_VERSION_DRAFT6_9)
				pt_bsn = iut_fsn;
#endif
				send(ACK);
				break;
			case ACK:
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case IUT_RPR:
				break;	/* stupid ITU-T SDLs */
			case ACK:
				break;
			case PROCESSOR_OUTAGE:
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case IUT_RPR:
				break;
			case TIMEOUT:
				signal(CLEARB);
				signal(SEND_MSU);
				start_tt(1000);
				signal(LPR);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_RPR:
				break;
			case DATA:
#if defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)||defined(M2PA_VERSION_DRAFT6_9)
				pt_bsn = iut_fsn;
#endif
				send(ACK);
				state = 5;
				break;
			default:
				return FAILURE;
			}
			break;
		case 5:
			switch ((event = get_event())) {
			case PROCESSOR_ENDED:
			case IUT_RPR:
				break;	/* stupid ITU-T SDLs */
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_4_2(void)
{
	for (;;) {
		switch (state) {
		case 0:
			signal(LPO);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case IUT_RPR:
				break;	/* stupid ITU-T SDLs */
			case PROCESSOR_OUTAGE:
				send(PROCESSOR_OUTAGE);
				send(PROCESSOR_ENDED);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = wait_event(0))) {
			case IUT_RPR:
			case IUT_RPO:
				break;
			case NO_MSG:
				send(LPR);
				send(PROCESSOR_ENDED);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case IUT_RPO:
				break;
			case IUT_RPR:
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_4_3(void)
{
	for (;;) {
		switch (state) {
		case 0:
			signal(LPO);
			send(LPO);
			send(PROCESSOR_OUTAGE);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case IUT_RPO:
				break;
			case PROCESSOR_OUTAGE:
				signal(LPR);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case IUT_RPO:
				send(LPR);
				send(PROCESSOR_ENDED);
				state = 3;
				break;
			case PROCESSOR_ENDED:
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case IUT_RPR:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_5_1(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	unsigned char old_bsn = 0x7f;
	for (;;) {
		switch (state) {
		case 0:
			old_bsn = iut_bsn;
			if (send(MSU_SEVEN_ONES))
				return INCONCLUSIVE;
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
				break;
			case FISU:
				if (iut_bsn != old_bsn)
					return FAILURE;
				send(FISU);
				break;
			case TIMEOUT:
				return SUCCESS;
			case IUT_DATA:
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_5_2(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			send(MSU_TOO_LONG);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
				break;
			case FISU:
				if (iut_bsn != 0x7f)
					return check_snibs(0x7f, 0xff);
				send(FISU);
				break;
			case TIMEOUT:
				return check_snibs(0x7f, 0xff);
			case IUT_DATA:
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_5_3(void)
{
	for (;;) {
		switch (state) {
		case 0:
			send(MSU_TOO_SHORT);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case TIMEOUT:
				return SUCCESS;
			case ACK:
			case IUT_DATA:
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_5_4a(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			if (send(FISU_FISU_1FLAG))
				return INCONCLUSIVE;
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case FISU:
				send(FISU);
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_5_4b(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			if (send(FISU_FISU_2FLAG))
				return INCONCLUSIVE;
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case FISU:
				send(FISU);
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_5_5a(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			if (send(MSU_MSU_1FLAG))
				return INCONCLUSIVE;
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case FISU:
				send(FISU);
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_5_5b(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			if (send(MSU_MSU_2FLAG))
				return INCONCLUSIVE;
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case FISU:
				send(FISU);
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_6_1(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			send(FISU_CORRUPT);
			stop_tt();
			count = 255;
			state = 1;
			break;
		case 1:
			switch ((event = wait_event(0))) {
			case FISU:
			case NO_MSG:
				if (tries < 8192) {
					int i;
					if (tries) {
						send(FISU_CORRUPT_S);
						for (i = 0; i < count; i++)
							send(FISU_S);
					} else {
						send(FISU_CORRUPT);
						send(FISU);
						for (i = 1; i < count; i++)
							send(FISU_S);
						send(COUNT);
						send(ETC);
					}
					tries++;
					break;
				}
				send(TRIES);
				return SUCCESS;
			default:
				send(TRIES);
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_6_2(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			stop_tt();
			count = 253;
			state = 1;
			break;
		case 1:
			switch ((event = wait_event(0))) {
			case FISU:
			case NO_MSG:
				if (tries < 8192) {
					int i;
					if (tries) {
						send(FISU_CORRUPT_S);
						for (i = 0; i < count; i++)
							send(FISU_S);
					} else {
						send(FISU_CORRUPT);
						send(FISU);
						for (i = 1; i < count; i++)
							send(FISU_S);
						send(COUNT);
						send(ETC);
					}
					tries++;
					break;
				}
				send(TRIES);
				return FAILURE;
			case OUT_OF_SERVICE:
				break;
			case OUT_OF_SERVICE:
				send(TRIES);
				return SUCCESS;
			default:
				send(TRIES);
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_6_3(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			count++;
			send(FISU_CORRUPT);
			stop_tt();
			state = 1;
			break;
		case 1:
			switch ((event = wait_event(0))) {
			case FISU:
			case NO_MSG:
				count++;
				send(FISU_CORRUPT_S);
				if (count > 128) {
					send(COUNT);
					return FAILURE;
				}
				break;
			case OUT_OF_SERVICE:
				break;
			case OUT_OF_SERVICE:
				if (count > 1)
					send(COUNT);
				if (count > 70)
					return FAILURE;
				else
					return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_6_4(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			if (send(TX_BREAK))
				return INCONCLUSIVE;
			start_tt(100);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case TIMEOUT:
				send(TX_MAKE);
				start_tt(1000);
				state = 2;
				break;
			default:
				break;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case IUT_IN_SERVICE:
				break;
			case FISU:
				send(FISU);
				break;
			case TIMEOUT:
				send(TX_MAKE);
				return SUCCESS;
			default:
				send(TX_MAKE);
				return FAILURE;
			}
			break;
		default:
			send(TX_MAKE);
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_7_1(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(OUT_OF_SERVICE);
				break;
			case ALIGNMENT:
				send(ALIGNMENT);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(ALIGNMENT);
				break;
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				beg_time = milliseconds(t4);
				start_tt(iutconf.sl.t4n * 10 / 2);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
			case TIMEOUT:
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = wait_event(0))) {
			case NO_MSG:
			case PROVING_NORMAL:
				if (count < iutconf.sdt.Tin - 1) {
					send(INVALID_STATUS);
					count++;
				} else {
					send(COUNT);
					send(PROVING_NORMAL);
					start_tt(iutconf.sl.t4n * 10 / 2 + 200);
					state = 5;
				}
				break;
			default:
				return FAILURE;
			}
			break;
		case 5:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
			case FISU:
				send(FISU);
				return SUCCESS;
			case TIMEOUT:
				return FAILURE;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_7_2(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(OUT_OF_SERVICE);
				break;
			case ALIGNMENT:
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 10 + 200);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(ALIGNMENT);
				break;
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				start_tt(iutconf.sl.t4n * 10 / 2);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
			case TIMEOUT:
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((even = wait_event(0))) {
			case NO_MSG:
			case PROVING_NORMAL:
				if (count < iutconf.sdt.Tin) {
					send(INVALID_STATUS);
					count++;
				} else {
					send(COUNT);
					send(PROVING_NORMAL);
					beg_time = milliseconds(t4);
					start_tt(iutconf.sl.t4n * 10 + 200);
					state = 5;
				}
				break;
			default:
				return FAILURE;
			}
			break;
		case 5:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
			case IUT_IN_SERVICE:
				break;
			case FISU:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_7_3(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(OUT_OF_SERVICE);
				break;
			case ALIGNMENT:
				send(ALIGNMENT);
				start_tt(iutconf.sl.t4n * 10 + 200);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(ALIGNMENT);
				break;
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				start_tt(iutconf.sl.t4n * 10 / 2);
				tries = 1;
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
			case TIMEOUT:
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((even = wait_event(0))) {
			case OUT_OF_SERVICE:
				break;
			case OUT_OF_SERVICE:
				send(COUNT);
				if (tries == iutconf.sl.M)
					return SUCCESS;
				return FAILURE;
			case NO_MSG:
			case PROVING_NORMAL:
				if (count <= iutconf.sdt.Tin) {
					send(INVALID_STATUS);
					count++;
				} else {
					send(COUNT);
					count = 0;
					send(PROVING_NORMAL);
					if (tries < iutconf.sl.M) {
						start_tt(iutconf.sl.t4n * 10 / 2);
						state = 3;
						tries++;
					} else {
						start_tt(iutconf.sl.t4n * 10 + 200);
						state = 5;
					}
				}
				break;
			default:
				return FAILURE;
			}
			break;
		case 5:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_NORMAL);
				break;
			case OUT_OF_SERVICE:
				break;
			case OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_7_4(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(OUT_OF_SERVICE);
				break;
			case ALIGNMENT:
				send(ALIGNMENT);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(ALIGNMENT);
				break;
			case PROVING_NORMAL:
				send(PROVING_EMERG);
				start_tt(iutconf.sl.t4e * 10 / 2);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_EMERG);
				break;
			case TIMEOUT:
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = wait_event(0))) {
			case NO_MSG:
			case PROVING_NORMAL:
				if (count < iutconf.sdt.Tie) {
					send(INVALID_STATUS);
					count++;
				} else {
					send(COUNT);
					send(PROVING_EMERG);
					beg_time = milliseconds(t4e);
					start_tt(iutconf.sl.t4e * 10 + 200);
					state = 5;
				}
				break;
			default:
				return FAILURE;
			}
			break;
		case 5:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_EMERG);
				break;
			case IUT_IN_SERVICE:
				break;
			case FISU:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_8_1(void)
{
	for (;;) {
		switch (state) {
		case 0:
			send(DATA);
			start_tt(5000);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case ACK:
				break;
			case IUT_DATA:
				signal(SEND_MSU);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case ACK:
				break;
			case DATA:
#if defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)||defined(M2PA_VERSION_DRAFT6_9)
				pt_bsn = iut_fsn;
#endif
				send(ACK);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_8_2(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			signal(SEND_MSU);
			signal(SEND_MSU);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case DATA:
				if (check_snibs(0xff, 0x80))
					return FAILURE;
				state = 2;
			case FISU:
				pt_fsn = pt_bsn = 0x7f;
				pt_fib = pt_bib = 0x80;
				send(FISU);
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case DATA:
				if (check_snibs(0xff, 0x81))
					return FAILURE;
				pt_fsn = pt_bsn = 0x7f;
				pt_fib = 0x80;
				pt_bib = 0x00;
				send(FISU);
				state = 3;
				break;
			case FISU:
				pt_fsn = pt_bsn = 0x7f;
				pt_fib = pt_bib = 0x80;
				send(FISU);
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case DATA:
				if (check_snibs(0xff, 0x00))
					return FAILURE;
				state = 4;
			case FISU:
				pt_fsn = pt_bsn = 0x7f;
				pt_fib = 0x80;
				pt_bib = 0x00;
				send(FISU);
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case DATA:
				if (check_snibs(0xff, 0x01))
					return FAILURE;
				return SUCCESS;
			case FISU:
				pt_fsn = pt_bsn = 0x7f;
				pt_fib = 0x80;
				pt_bib = 0x00;
				send(FISU);
				break;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_8_3(void)
{
	int i;
	int n = iutconf.sl.N1;
	for (;;) {
		switch (state) {
		case 0:
			stop_tt();
			for (i = 0; i < n; i++)
				signal(SEND_MSU);
			for (i = 0; i < n; i++)
				signal(SEND_MSU);
			count = 0;
			show_fisus = 0;
			show_timeout = 1;
			start_tt(iutconf.sl.t7 * 10 / 2 - 100);
			state = 1;
			break;
		case 1:
			switch ((event = wait_event(SHORT_WAIT))) {
			case DATA:
				if (++count == n) {
					nacks = n;
					signal(ETC);
					signal(COUNT);
#if defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)||defined(M2PA_VERSION_DRAFT6_9)
					pt_bsn += nacks;
#endif
					send(ACK);
					nacks = 1;
					count = 0;
					oldret = 0;
					cntret = 0;
					start_tt(iutconf.sl.t7 * 10 / 2 + 200);
					state = 2;
				}
				break;
			case TIMEOUT:
				signal(ETC);
				signal(COUNT);
				nacks = count;
#if defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)||defined(M2PA_VERSION_DRAFT6_9)
				pt_bsn += nacks;
#endif
				send(ACK);
				nacks = 1;
				count = 0;
				oldret = 0;
				cntret = 0;
				start_tt(iutconf.sl.t7 * 10 / 2 + 200);
				show_timeout = 1;
				show_fisus = 1;
				state = 2;
				break;
			default:
				signal(ETC);
				signal(COUNT);
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case DATA:
				if (++count == n) {
					nacks = n;
					signal(ETC);
					signal(COUNT);
#if defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)||defined(M2PA_VERSION_DRAFT6_9)
					pt_bsn += nacks;
#endif
					send(ACK);
					nacks = 1;
					return SUCCESS;
				}
				break;
			default:
				signal(ETC);
				signal(COUNT);
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_8_4(void)
{
	for (;;) {
		switch (state) {
		case 0:
			send(ACK);
			signal(SEND_MSU);
			start_tt(iutconf.sl.t7 * 10 + 200);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case DATA:
#if defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)||defined(M2PA_VERSION_DRAFT6_9)
				pt_bsn = iut_fsn;
#endif
				send(ACK);
				send(DATA);
				start_tt(iutconf.sl.t7 * 10 + 200);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case IUT_DATA:
				state = 3;
				break;
			case ACK:
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_8_5(void)
{
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
	return NOT_APPLICABLE;	/* can't do this */
#else
	int inds = 0;
	for (;;) {
		switch (state) {
		case 0:
			wait_event(0);
			send(DATA);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case IUT_DATA:
				inds++;
				break;
			case ACK:
				if (iut_fsn != 0)
					return FAILURE;
				if (iut_bsn != 0) {
					if (iut_bsn != 1)
						return FAILURE;
					pt_fsn--;
					send(DATA);
					state = 2;
					break;
				}
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = wait_event(SHORT_WAIT))) {
			case IUT_DATA:
				if (inds++)
					return FAILURE;
				break;
			default:
				if (iut_fsn != 0)
					return FAILURE;
				if (iut_bsn != 1)
					return FAILURE;
				if (inds) {
					send(DATA);
					state = 3;
					break;
				}
				break;
			}
			break;
		case 3:
			switch ((event = wait_event(NORMAL_WAIT))) {
			case IUT_DATA:
				if (++inds > 2)
					return FAILURE;
				break;
			default:
				if (iut_fsn != 0)
					return FAILURE;
				if (iut_bsn != 1) {
					if (iut_bsn != 2)
						return FAILURE;
					if (inds == 2)
						return SUCCESS;
				}
				break;
			case TIMEOUT:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_8_6(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			wait_event(0);
			pt_fib = 0x00;
			send(DATA);
			state = 1;
			break;
		case 1:
			switch ((event = wait_event(0))) {
			case IUT_DATA:
				break;
			case FISU:
			case NO_MSG:
				pt_fib = 0x80;
				send(FISU);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = wait_event(0))) {
			case FISU:
			case NO_MSG:
				send(FISU);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case FISU:
				if ((iut_bib | iut_bsn) != 0xff || (iut_fib | iut_fsn) != 0xff) {
					if (check_snibs(0x7f, 0xff))
						return FAILURE;
					pt_fib = 0x00;
					pt_fsn = 0x7f;
					oldmsg = 0;
					cntmsg = 0;
					send(DATA);
					state = 4;
					break;
				}
				send(FISU);
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_DATA:
				break;
			case FISU:
				if ((iut_bib | iut_bsn) != 0x7f || (iut_fib | iut_fsn) != 0xff) {
					if (check_snibs(0x00, 0xff))
						return FAILURE;
					return SUCCESS;
				}
				send(FISU);
				break;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_8_7(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			send(FISU);
			state = 1;
			break;
		case 1:
			switch ((event = wait_event(0))) {
			case FISU:
			case NO_MSG:
				pt_fib = 0x00;
				send(FISU);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = wait_event(0))) {
			case FISU:
			case NO_MSG:
				pt_fib = 0x80;
				send(FISU);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = wait_event(0))) {
			case FISU:
			case NO_MSG:
				pt_fib = 0x00;
				send(FISU);
				state = 4;
				start_tt(100);
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case FISU:
				break;
			case OUT_OF_SERVICE:
				break;
			case OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_8_8(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			send(FISU);
			state = 1;
			break;
		case 1:
			switch ((event = wait_event(0))) {
			case FISU:
			case NO_MSG:
				pt_fib = 0x00;
				send(FISU);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = wait_event(0))) {
			case FISU:
			case NO_MSG:
				pt_fib = 0x80;
				send(FISU);
				start_tt(1000);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case FISU:
				send(FISU);
				break;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_8_9(void)
{
	for (;;) {
		switch (state) {
		case 0:
			state = 1;
			break;
		case 1:
			send(LPO);
			send(PROCESSOR_OUTAGE);
			state = 6;
			break;
		case 6:
			switch ((event = get_event())) {
			case IUT_RPO:
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			send(DATA);
			state = 3;
			break;
		case 3:
			start_tt(1000);
			state = 4;
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_RPR:
			case ACK:
				break;
			case IUT_DATA:
				send(DATA);
				state = 5;
				break;
			default:
				return FAILURE;
			}
			break;
		case 5:
			switch ((event = get_event())) {
			case IUT_RPR:
				break;
			case ACK:
				break;
			case IUT_DATA:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_8_10(void)
{
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
	return NOTAPPLICABLE;	/* can't do this */
#else
	uint inds = 0;
	for (;;) {
		switch (state) {
		case 0:
			pt_bsn = 0x3fff;
			send(DATA);
			state = 3;
		case 3:
			switch ((event = get_event())) {
			case IUT_DATA:
				inds++;
				break;
			case ACK:
				if (iut_fsn != 0)
					return FAILURE;
				if (iut_bsn != 0)
					if (iut_bsn != 1)
						return FAILURE;
				pt_bsn = 0;
				send(DATA);
				state = 4;
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case IUT_DATA:
				if (inds++ > 1)
					return FAILURE;
				if (inds == 2)
					return SUCCESS;
				break;
			case ACK:
				if (iut_fsn != 0)
					return FAILURE;
				if (iut_bsn != 1)
					if (iut_bsn != 2)
						return FAILURE;
				break;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_8_11(void)
{
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
	return NOTAPPLICABLE;	/* can't do this */
#else
	for (;;) {
		switch (state) {
		case 0:
			state = 1;
		case 1:
			switch ((event = wait_event(0))) {
			case ACK:
			case NO_MSG:
				pt_bsn = 0x3fff;
				send(ACK);
				oldmsg = 0;
				cntmsg = 0;
				send(ACK);
				pt_bsn = 0;
				send(ACK);
				state = 2;
				start_tt(1000);
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case ACK:
				break;
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_8_12(void)
{
	for (;;) {
		switch (state) {
		case 0:
			signal(SEND_MSU);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case DATA:
				start_tt(iutconf.sl.t7 * 10 + 200);
				beg_time = milliseconds(t7);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				return check_time("T7  ", beg_time, timer[t7].lo, timer[t7].hi);
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_8_13(void)
{
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = wait_event(SHORT_WAIT))) {
			case NO_MSG:
				signal(STOP);
				start_tt(1000);
				state = 1;
				break;
			default:
				return FAILURE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_9_1(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			signal(SEND_MSU);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case FISU:
				pt_bsn = 0x7f;
				send(FISU);
				break;
			case DATA:
				if (count < 4) {
					cntret = -1;
					pt_bsn = 0x7f;
					send(FISU);
					count++;
					break;
				}
				send(FISU);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case DATA:
				send(FISU);
				break;
			case FISU:
				if (check_snibs(0xff, 0x80))
					return FAILURE;
				send(DATA);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case IUT_DATA:
				break;
			case FISU:
				if ((iut_bsn | iut_bib) != 0xff || (iut_fsn | iut_fib) != 0x80)
					return check_snibs(0x80, 0x80);
				send(FISU);
				break;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_9_2(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	int fsn_lo = 0, fsn_hi = 0, fsn_ex = 0;
	for (;;) {
		switch (state) {
		case 0:
			fsn_lo = 0;
			signal(SEND_MSU);
			signal(SEND_MSU);
			fsn_hi = 1;
			fsn_ex = fsn_lo;
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case FISU:
				pt_bsn = 0x7f;
				send(FISU);
				break;
			case DATA:
				if (iut_fsn < fsn_hi) {
					if (iut_fsn != fsn_ex)
						return FAILURE;
					if (++fsn_ex == fsn_hi) {
						fsn_ex = fsn_lo;
						tries++;
					}
					oldisb = (oldisb & 0xff80) + fsn_ex;
					pt_bsn = 0x7f;
					send(FISU);
					break;
				}
				if (iut_fsn != fsn_hi)
					return FAILURE;
				signal(ETC);
				signal(TRIES);
				tries = 0;
				oldisb = (oldisb & 0xff80) + fsn_ex;
				pt_bsn = 0x7f;
				send(FISU);
				signal(SEND_MSU);
				fsn_hi++;
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case DATA:
				if (iut_fsn < fsn_hi) {
					if (iut_fsn != fsn_ex)
						return FAILURE;
					if (++fsn_ex == fsn_hi) {
						fsn_ex = fsn_lo;
						tries++;
					}
					oldisb = (oldisb & 0xff80) + fsn_ex;
					pt_bsn = 0x7f;
					send(FISU);
					break;
				}
				if (iut_fsn != fsn_hi)
					return FAILURE;
				signal(ETC);
				signal(TRIES);
				tries = 0;
				oldisb = (oldisb & 0xff80) + fsn_ex;
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case FISU:
				if (iut_fsn == 2)
					return SUCCESS;
				return FAILURE;
			case DATA:
				pt_bsn = fsn_lo;
				send(FISU);
				if (iut_fsn != fsn_ex) {
					if (iut_fsn == fsn_ex + 1) {
						if (fsn_lo < fsn_hi) {
							fsn_lo++;
							fsn_ex++;
							signal(ETC);
							signal(TRIES);
							tries = 0;
						}
					} else
						fsn_ex--;
				} else if (++tries > 100)
					return FAILURE;
				if (++fsn_ex > fsn_hi)
					fsn_ex = fsn_lo;
				oldisb = (oldisb & 0xff80) + fsn_ex;
				break;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_9_3(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	int i;
	int h = (iutconf.opt.popt & SS7_POPT_HSL) ? 6 : 3;
	int n = iutconf.sl.N1;
	msu_len = iutconf.sl.N2 / iutconf.sl.N1 - h - 1;
	if (msu_len < 3)
		return INCONCLUSIVE;
	printf("(N1=%ld, N2=%ld, n=%d, l=%d)\n", iutconf.sl.N1, iutconf.sl.N2, n, msu_len);
	fflush(stdout);
	for (;;) {
		switch (state) {
		case 0:
			start_tt(iutconf.sl.t7 * 10 + 1000);
			for (i = 0; i < n + 1; i++)
				signal(SEND_MSU);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case FISU:
				send(FISU);
				break;
			case DATA:
				pt_bsn = 0x7f;
				send(FISU);
				count = 0;
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case DATA:
				if (iut_fsn == n)
					return FAILURE;
				if (iut_fsn == n - 1)
					count++;
				if (iut_fsn > 1 && iut_fsn < n - 3)
					oldisb++;
				if (iut_fsn == 0 && count) {
					pt_bsn = 0x0;
					send(FISU);
					count = 1;
					state = 3;
					break;
				}
				pt_bsn = 0x7f;
				send(FISU);
				if (iut_fsn == 2)
					signal(ETC);
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case DATA:
				if (iut_fsn == n) {
					send(FISU);
					return SUCCESS;
				}
				if (iut_fsn > 1 && iut_fsn < n - 3)
					oldisb++;
				pt_bsn = 0;
				send(FISU);
				if (iut_fsn == 2)
					signal(ETC);
				break;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_9_4(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	int i;
	int h = (iutconf.opt.popt & SS7_POPT_HSL) ? 6 : 3;
	int n = iutconf.sl.N1 - 1;
	msu_len = iutconf.sl.N2 / (iutconf.sl.N1 - 1) - h + 1;
	n = iutconf.sl.N2 / (msu_len + h) + 1;
	if (msu_len > iutconf.sdl.m)
		return INCONCLUSIVE;
	printf("(N1=%ld, N2=%ld, n=%d, l=%d)\n", iutconf.sl.N1, iutconf.sl.N2, n, msu_len);
	fflush(stdout);
	for (;;) {
		switch (state) {
		case 0:
			start_tt(iutconf.sl.t7 * 10 + 1000);
			for (i = 0; i < n + 1; i++)
				signal(SEND_MSU);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case FISU:
				send(FISU);
				break;
			case DATA:
				pt_bsn = 0x7f;
				send(FISU);
				count = 0;
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case DATA:
				if (iut_fsn == n)
					return FAILURE;
				if (iut_fsn == n - 1)
					count++;
				if (iut_fsn > 1 && iut_fsn < n - 3)
					oldisb++;
				if (iut_fsn == 0 && count) {
					pt_bsn = 0x0;
					send(FISU);
					count = 1;
					state = 3;
					break;
				}
				pt_bsn = 0x7f;
				send(FISU);
				if (iut_fsn == 2)
					signal(ETC);
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case DATA:
				if (iut_fsn == n) {
					send(FISU);
					return SUCCESS;
				}
				if (iut_fsn > 1 && iut_fsn < n - 3)
					oldisb++;
				pt_bsn = 0;
				send(FISU);
				if (iut_fsn == 2)
					signal(ETC);
				break;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_9_5(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	int i;
	int h = (iutconf.opt.popt & SS7_POPT_HSL) ? 6 : 3;
	int n = iutconf.sl.N1;
	msu_len = iutconf.sl.N2 / iutconf.sl.N1 - h - 1;
	if (msu_len < 3) {
		n = iutconf.sl.N1 - 1;
		msu_len = iutconf.sl.N2 / (iutconf.sl.N1 - 1) - h + 1;
		n = iutconf.sl.N2 / (msu_len + h) + 1;
		if (msu_len > iutconf.sdl.m)
			return INCONCLUSIVE;
	}
	printf("(N1=%ld, N2=%ld, n=%d, l=%d)\n", iutconf.sl.N1, iutconf.sl.N2, n, msu_len);
	fflush(stdout);
	for (;;) {
		switch (state) {
		case 0:
			start_tt(iutconf.sl.t7 * 10 + 1000);
			for (i = 0; i < n + 1; i++)
				signal(SEND_MSU);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case FISU:
				send(FISU);
				break;
			case DATA:
				pt_bsn = 0x7f;
				send(FISU);
				count = 0;
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case DATA:
				if (iut_fsn == n)
					return FAILURE;
				if (iut_fsn == n - 1)
					count++;
				if (iut_fsn > 1 && iut_fsn < n - 3)
					oldisb++;
				if (iut_fsn == 3 && count) {
					pt_bsn = n - 1;
					send(FISU);
					count = 1;
					state = 3;
					break;
				}
				pt_bsn = 0x7f;
				send(FISU);
				if (iut_fsn == 2)
					signal(ETC);
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case DATA:
				if (iut_fsn == n - 3)
					return FAILURE;
				if (iut_fsn == n) {
					send(FISU);
					return SUCCESS;
				}
				if (iut_fsn > 1 && iut_fsn < n - 3)
					oldisb++;
				pt_bsn = n - 1;
				send(FISU);
				if (iut_fsn == 2)
					signal(ETC);
				break;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_9_6(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	int i;
	int h = (iutconf.opt.popt & SS7_POPT_HSL) ? 6 : 3;
	int n = iutconf.sl.N1;
	msu_len = iutconf.sl.N2 / iutconf.sl.N1 - h - 1;
	if (msu_len < 3) {
		n = iutconf.sl.N1 - 1;
		msu_len = iutconf.sl.N2 / (iutconf.sl.N1 - 1) - h + 1;
		n = iutconf.sl.N2 / (msu_len + h) + 1;
		if (msu_len > iutconf.sdl.m)
			return INCONCLUSIVE;
	}
	printf("(N1=%ld, N2=%ld, n=%d, l=%d)\n", iutconf.sl.N1, iutconf.sl.N2, n, msu_len);
	fflush(stdout);
	for (;;) {
		switch (state) {
		case 0:
			start_tt(iutconf.sl.t7 * 10 + 1000);
			for (i = 0; i < n + 1; i++)
				signal(SEND_MSU);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case FISU:
				send(FISU);
				break;
			case DATA:
				pt_bsn = 0x7f;
				send(FISU);
				count = 0;
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case DATA:
				if (iut_fsn == n)
					return FAILURE;
				if (iut_fsn == n - 1)
					count++;
				if (iut_fsn > 1 && iut_fsn < n - 3)
					oldisb++;
				if (iut_fsn == 3 && count == 2) {
					pt_bsn = n - 1;
					send(FISU);
					return SUCCESS;
				}
				pt_bsn = 0x7f;
				send(FISU);
				if (iut_fsn == 2)
					signal(ETC);
				break;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_9_7(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			start_tt(5000);
			signal(SEND_MSU);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case FISU:
				send(FISU);
				break;
			case DATA:
				pt_bsn = 0x7f;
				send(LPO);
				send(PROCESSOR_OUTAGE);
				start_tt(iutconf.sl.t7 * 10 + 200);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case IUT_RPO:
				break;
			case DATA:
				pt_bsn = 0x7f;
				send(PROCESSOR_OUTAGE);
				break;
			case FISU:
				if (!count++)
					if (check_snibs(0xff, 0x80))
						return FAILURE;
				pt_bsn = 0x7f;
				send(PROCESSOR_OUTAGE);
				break;
			case TIMEOUT:
				signal(CLEARB);
				send(LPR);
				pt_bsn = 0x7f;
				send(DATA);
				start_tt(500);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case IUT_DATA:
			case IUT_RPR:
				break;
			case FISU:
				if (iut_bsn != 0) {
					pt_bsn = 0x7f;
					pt_fsn = 0x7f;
					send(DATA);
					break;
				}
				send(FISU);
				return SUCCESS;
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_9_8(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			pt_bsn = 0x00;
			pt_fsn = 0x7f;
			send(DATA);
			pt_bsn = 0x7f;
			pt_fsn = 0x7f;
			send(DATA);
			start_tt(1000);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case IUT_DATA:
				break;
			case FISU:
				if (iut_bsn == 0)
					return SUCCESS;
				pt_bsn = 0x7f;
				pt_fsn = 0x7f;
				send(DATA);
				break;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_9_9(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			pt_bsn = 0x7e;
			pt_fsn = 0x7f;
			send(DATA);
			pt_bsn = 0x7f;
			pt_fsn = 0x7f;
			send(DATA);
			pt_bsn = 0x7e;
			pt_fsn = 0x7f;
			send(DATA);
			start_tt(1000);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case IUT_DATA:
				return FAILURE;
			case FISU:
				pt_bsn = 0x7f;
				pt_fsn = 0x7f;
				send(DATA);
				break;
			case OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_9_10(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			pt_fsn = 0x7f;
			send(DATA);
			pt_fsn = 0x01;
			send(DATA);
			start_tt(1000);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case IUT_DATA:
				if (++count == 2)
					return FAILURE;
				break;
			case FISU:
				if (iut_bsn != 0x7f) {
					if (check_snibs(0x80, 0xff))
						return FAILURE;
					return SUCCESS;
				}
				pt_fsn = 0x7f;
				send(DATA);
				break;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_9_11(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			signal(SEND_MSU);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case FISU:
				send(FISU);
				break;
			case DATA:
				pt_bsn = 0x7f;
				send(FISU);
				beg_time = milliseconds(t7);
				start_tt(iutconf.sl.t7 * 10 + 200);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case DATA:
				pt_bsn = 0x7f;
				send(FISU);
				break;
			case OUT_OF_SERVICE:
				break;
			case OUT_OF_SERVICE:
				return check_time("T7  ", beg_time, timer[t7].lo, timer[t7].hi);
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_9_12(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			pt_fsn = 0x00;
			send(FISU);
			pt_fsn = 0x7f;
			start_tt(1000);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case FISU:
				send(FISU);
				break;
			case TIMEOUT:
				return check_snibs(0xff, 0xff);
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_9_13(void)
{
	return NOTAPPLICABLE;	/* can't do this */
#if 0
	for (;;) {
		switch (state) {
		case 0:
			signal(STOP);
			start_tt(1000);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case FISU:
				send(FISU);
				break;
			case OUT_OF_SERVICE:
				break;
			case OUT_OF_SERVICE:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
#endif
}
static int test_10_1(void)
{
	for (;;) {
		switch (state) {
		case 0:
			signal(CONG_D);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case BUSY:
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = wait_event(NORMAL_WAIT))) {
			case NO_MSG:
				signal(NO_CONG);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case BUSY_ENDED:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_10_2(void)
{
	for (;;) {
		switch (state) {
		case 0:
			signal(SEND_MSU);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case DATA:
				send(BUSY);
				start_tt(iutconf.sl.t7 * 10 + 200);
				beg_time = milliseconds(t7);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case TIMEOUT:
				start_tt((iutconf.sl.t6 - iutconf.sl.t7) * 10 - 300);
				state = 3;
				break;
			default:
				return FAILURE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
			case TIMEOUT:
#if defined(M2PA_VERSION_DRAFT6)||defined(M2PA_VERSION_DRAFT6_1)||defined(M2PA_VERSION_DRAFT6_9)
				pt_bsn = iut_fsn;
#endif
				send(ACK);
				state = 4;
				start_tt(1000);
				break;
			default:
				return FAILURE;
			}
			break;
		case 4:
			switch ((event = get_event())) {
			case TIMEOUT:
				return SUCCESS;
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}
static int test_10_3(void)
{
	for (;;) {
		switch (state) {
		case 0:
			signal(SEND_MSU);
			state = 1;
			break;
		case 1:
			switch ((event = get_event())) {
			case DATA:
				send(BUSY);
				start_tt(timer[t6].hi * 10 + 200);
				beg_time = milliseconds(t6);
				state = 2;
				break;
			default:
				return FAILURE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				break;
			case IUT_OUT_OF_SERVICE:
				return check_time("T6  ", beg_time, timer[t6].lo, timer[t6].hi);
			default:
				return FAILURE;
			}
			break;
		default:
			return SCRIPTERROR;
		}
	}
}

/*
 *  =========================================================================
 *
 *  OPENING, CONFIGURING and CLOSING Devices
 *
 *  =========================================================================
 */
/*
 *  -------------------------------------------------------------------------
 *
 *  Opening, configuring and closing the Management Stream (MGM)
 *
 *  -------------------------------------------------------------------------
 */
/*
 *  Open and configure for SCTP operation the Protocol Tester (PT).
 */
static int mgm_open(void)
{
	int ret;
	if (verbose) {
		printf("                 :open |                                            \n");
		FFLUSH(stdout);
	}
	if ((mgm_fd = open("/dev/sctp_n", O_NONBLOCK | O_RDWR)) < 0) {
		printf("  ****ERROR: open failed\n");
		printf("             %s: %s\n", __FUNCTION__, strerror(errno));
		FFLUSH(stdout);
		return FAILURE;
	}
	if (verbose) {
		printf("                :ioctl |                                            \n");
		FFLUSH(stdout);
	}
	if (ioctl(mgm_fd, I_SRDOPT, RMSGD) < 0) {
		printf("  ****ERROR: ioctl failed\n");
		printf("             %s: %s\n", __FUNCTION__, strerror(errno));
		FFLUSH(stdout);
		return FAILURE;
	}
	if ((ret = control(OPTMGMT_REQ)) != SUCCESS)
		return ret;
	if ((event = wait_event(SHORT_WAIT)) != OK_ACK)
		return FAILURE;
	if ((ret = control(BIND_REQ)) != SUCCESS)
		return ret;
	if ((event = wait_event(SHORT_WAIT)) != BIND_ACK)
		return FAILURE;
	return SUCCESS;
}

/*
 *  Close the Protocol Tester (PT).
 */
static int mgm_close(void)
{
	if (verbose) {
		printf("                :close |                                            \n");
		FFLUSH(stdout);
	}
	if (close(mgm_fd) < 0) {
		printf("  ****ERROR: close failed\n");
		printf("             %s: %s\n", __FUNCTION__, strerror(errno));
		FFLUSH(stdout);
		return FAILURE;
	}
	return SUCCESS;
}

/*
 *  -------------------------------------------------------------------------
 *
 *  Opening, configuring and closing the Protocol Tester (PT)
 *
 *  -------------------------------------------------------------------------
 */
/*
 *  Open and configure for SCTP operation the Protocol Tester (PT).
 */
static int pt_open(void)
{
	int ret;
	if (verbose) {
		printf("                  :open                                             \n");
		FFLUSH(stdout);
	}
	if ((pt_fd = open("/dev/sctp_n", O_NONBLOCK | O_RDWR)) < 0) {
		printf("****ERROR: open failed\n");
		printf("           %s: %s\n", __FUNCTION__, strerror(errno));
		FFLUSH(stdout);
		return FAILURE;
	}
	if (verbose) {
		printf("                 :ioctl                                             \n");
		FFLUSH(stdout);
	}
	if (ioctl(pt_fd, I_SRDOPT, RMSGD) < 0) {
		printf("****ERROR: ioctl failed\n");
		printf("           %s: %s\n", __FUNCTION__, strerror(errno));
		FFLUSH(stdout);
		return FAILURE;
	}
	if ((ret = send(OPTMGMT_REQ)) != SUCCESS)
		return ret;
	if ((event = wait_event(SHORT_WAIT)) != OK_ACK)
		return FAILURE;
	if ((ret = send(BIND_REQ)) != SUCCESS)
		return ret;
	if ((event = wait_event(SHORT_WAIT)) != BIND_ACK)
		return FAILURE;
	return SUCCESS;
}

/*
 *  Close the Protocol Tester (PT).
 */
static int pt_close(void)
{
	if (verbose) {
		printf("                 :close                                             \n");
		FFLUSH(stdout);
	}
	if (close(pt_fd) < 0) {
		printf("****ERROR: close failed\n");
		printf("           %s: %s\n", __FUNCTION__, strerror(errno));
		FFLUSH(stdout);
		return FAILURE;
	}
	return SUCCESS;
}

/*
 *  -------------------------------------------------------------------------
 *
 *  Opening, configuring and closing the Implementation Under Test (IUT)
 *
 *  -------------------------------------------------------------------------
 */
/*
 *  Open and configure for SCTP operation the Implementation Under Test (IUT).
 */
static int iut_open(void)
{
	int ret;
	if (verbose) {
		printf("                                             :open                  \n");
		FFLUSH(stdout);
	}
	if ((iut_fd = open("/dev/sctp_n", O_NONBLOCK | O_RDWR)) < 0) {
		printf("                                   ****ERROR: open failed\n");
		printf("                                              %s: %s\n", __FUNCTION__, strerror(errno));
		FFLUSH(stdout);
		return FAILURE;
	}
	if (verbose) {
		printf("                                             :ioctl                 \n");
		FFLUSH(stdout);
	}
	if (ioctl(iut_fd, I_SRDOPT, RMSGD) < 0) {
		printf("                                   ****ERROR: ioctl failed\n");
		printf("                                              %s: %s\n", __FUNCTION__, strerror(errno));
		FFLUSH(stdout);
		return FAILURE;
	}
	if ((ret = signal(OPTMGMT_REQ)) != SUCCESS)
		return FAILURE;
	if ((event = wait_event(SHORT_WAIT)) != OK_ACK)
		return FAILURE;
	if ((ret = signal(BIND_REQ)) != SUCCESS)
		return FAILURE;
	if ((event = wait_event(SHORT_WAIT)) != BIND_ACK)
		return FAILURE;
	return SUCCESS;
}

/*
 *  Connect the Implementation Under Test (IUT) to the Protocol Tester (PT).
 */
static int iut_connect(void)
{
	int ret;
	if (verbose) {
		printf("                                             :connect               \n");
		FFLUSH(stdout);
	}
	if ((ret = signal(CONN_REQ)) != SUCCESS)
		return ret;
	if ((event = wait_event(LONG_WAIT)) != CONN_IND)
		return FAILURE;
	if ((ret = control(CONN_RES)) != SUCCESS)
		return ret;
	ret = wait_event(LONG_WAIT);
	if (ret != OK_ACK && ret != CONN_CON)
		return FAILURE;
	ret = wait_event(LONG_WAIT);
	if (ret != OK_ACK && ret != CONN_CON)
		return FAILURE;
	return SUCCESS;
}

/*
 *  Push and configure Implementation Under Test (IUT) for SL operation.
 */
static int iut_m2pa_push(void)
{
	struct strioctl ctl;
	if (verbose) {
		printf("                                             :push m2pa-sl          \n");
		FFLUSH(stdout);
	}
	if (ioctl(iut_fd, I_PUSH, "m2pa-sl") < 0) {
		printf("                                   ****ERROR: push m2pa-sl failed\n");
		printf("                                              %s: %s\n", __FUNCTION__, strerror(errno));
		FFLUSH(stdout);
		return FAILURE;
	}
	if (verbose) {
		printf("                                             :options sdl           \n");
		FFLUSH(stdout);
	}
	iutconf.opt.popt = iut_options;
	ctl.ic_cmd = SDL_IOCSOPTIONS;
	ctl.ic_timout = 0;
	ctl.ic_len = sizeof(iutconf.opt);
	ctl.ic_dp = (char *) &iutconf.opt;
	if (ioctl(iut_fd, I_STR, &ctl) < 0) {
		printf("                                   ****ERROR: options sdl failed\n");
		printf("                                              %s: %s\n", __FUNCTION__, strerror(errno));
		FFLUSH(stdout);
		return FAILURE;
	}
	if (verbose) {
		printf("                                             :config sdl            \n");
		FFLUSH(stdout);
	}
	ctl.ic_cmd = SDL_IOCSCONFIG;
	ctl.ic_timout = 0;
	ctl.ic_len = sizeof(iutconf.sdl);
	ctl.ic_dp = (char *) &iutconf.sdl;
	if (ioctl(iut_fd, I_STR, &ctl) < 0) {
		printf("                                   ****ERROR: config sdl failed\n");
		FFLUSH(stdout);
		printf("                                              %s: %s\n", __FUNCTION__, strerror(errno));
		return FAILURE;
	}
	if (verbose) {
		printf("                                             :options sdt           \n");
		FFLUSH(stdout);
	}
	iutconf.opt.popt = iut_options;
	ctl.ic_cmd = SDT_IOCSOPTIONS;
	ctl.ic_timout = 0;
	ctl.ic_len = sizeof(iutconf.opt);
	ctl.ic_dp = (char *) &iutconf.opt;
	if (ioctl(iut_fd, I_STR, &ctl) < 0) {
		printf("                                   ****ERROR: options sdt failed\n");
		FFLUSH(stdout);
		printf("                                              %s: %s\n", __FUNCTION__, strerror(errno));
		return FAILURE;
	}
	if (verbose) {
		printf("                                             :config sdt            \n");
		FFLUSH(stdout);
	}
	ctl.ic_cmd = SDT_IOCSCONFIG;
	ctl.ic_timout = 0;
	ctl.ic_len = sizeof(iutconf.sdt);
	ctl.ic_dp = (char *) &iutconf.sdt;
	if (ioctl(iut_fd, I_STR, &ctl) < 0) {
		printf("                                   ****ERROR: config sdt failed\n");
		printf("                                              %s: %s\n", __FUNCTION__, strerror(errno));
		FFLUSH(stdout);
		return FAILURE;
	}
	if (verbose) {
		printf("                                             :options sl            \n");
		FFLUSH(stdout);
	}
	iutconf.opt.popt = iut_options;
	ctl.ic_cmd = SL_IOCSOPTIONS;
	ctl.ic_timout = 0;
	ctl.ic_len = sizeof(iutconf.opt);
	ctl.ic_dp = (char *) &iutconf.opt;
	if (ioctl(iut_fd, I_STR, &ctl) < 0) {
		printf("                                   ****ERROR: options sl failed\n");
		printf("                                              %s: %s\n", __FUNCTION__, strerror(errno));
		FFLUSH(stdout);
		return FAILURE;
	}
	if (verbose) {
		printf("                                             :config sl             \n");
		FFLUSH(stdout);
	}
	ctl.ic_cmd = SL_IOCSCONFIG;
	ctl.ic_timout = 0;
	ctl.ic_len = sizeof(iutconf.sl);
	ctl.ic_dp = (char *) &iutconf.sl;
	if (ioctl(iut_fd, I_STR, &ctl) < 0) {
		printf("                                   ****ERROR: config sl failed\n");
		printf("                                              %s: %s\n", __FUNCTION__, strerror(errno));
		FFLUSH(stdout);
		return FAILURE;
	}
	return SUCCESS;
}
static int iut_enable(void)
{
	int ret;
	if ((ret = signal(ENABLE_REQ)) != SUCCESS)
		return FAILURE;
	if ((event = wait_event(SHORT_WAIT)) != ENABLE_CON)
		return FAILURE;
	return SUCCESS;
}
static int iut_disable(void)
{
	int ret;
	if ((ret = signal(DISABLE_REQ)) != SUCCESS)
		return FAILURE;
	if (wait_event(SHORT_WAIT) != DISABLE_CON)
		return FAILURE;
	return SUCCESS;
}
static int iut_pop(void)
{
	if (verbose) {
		printf("                                             :pop                   \n");
		FFLUSH(stdout);
	}
	if (ioctl(iut_fd, I_POP, 0) < 0) {
		printf("                                   ****ERROR: pop failed\n");
		printf("                                              %s: %s\n", __FUNCTION__, strerror(errno));
		FFLUSH(stdout);
		return FAILURE;
	}
	return SUCCESS;
}
static int iut_disconnect(void)
{
	int ret;
	if ((ret = signal(DISCON_REQ)) != SUCCESS)
		return ret;
	if (wait_event(SHORT_WAIT) != OK_ACK)
		return FAILURE;
	if (wait_event(LONG_WAIT) != DISCON_IND)
		return FAILURE;
	return SUCCESS;
}

/*
 *  Close Implementation Under Test (IUT).
 */
static int iut_close(void)
{
	if (verbose) {
		printf("                                             :close                 \n");
		FFLUSH(stdout);
	}
	if (close(iut_fd) < 0) {
		printf("                                   ****ERROR: close failed\n");
		printf("                                              %s: %s\n", __FUNCTION__, strerror(errno));
		FFLUSH(stdout);
		return FAILURE;
	}
	return SUCCESS;
}

/*
 *  =========================================================================
 *
 *  PRECONDITIONS and POSTCONDITIONS
 *
 *  =========================================================================
 */
/*
 *  Common Postcondition.
 */
static int iut_power_off(void)
{
	signal(STOP);
	stop_tt();
	show_msus = 0;
	show_fisus = 1;
//      while ( wait_event(0) != NO_MSG );
	iut_disable();
	ioctl(iut_fd, I_FLUSH, FLUSHRW);
	iut_pop();
	iut_disconnect();
	iut_close();
	ioctl(pt_fd, I_FLUSH, FLUSHRW);
	pt_close();
	ioctl(mgm_fd, I_FLUSH, FLUSHRW);
	mgm_close();
	return SUCCESS;
}

/*
 *  Common Preconditions:
 */
static int link_power_off(void)
{
	show_msus = 1;
	show_fisus = 1;
	show_timeout = 0;
	pt_bib = pt_fib = iut_bib = iut_fib = 0x0;
	pt_bsn = pt_fsn = iut_bsn = iut_fsn = 0x0;
	iut_options = 0;
	if (mgm_open() != SUCCESS)
		return INCONCLUSIVE;
	if (pt_open() != SUCCESS)
		return INCONCLUSIVE;
	if (iut_open() != SUCCESS)
		return INCONCLUSIVE;
	if (iut_connect() != SUCCESS)
		return INCONCLUSIVE;
	if (iut_m2pa_push() != SUCCESS)
		return INCONCLUSIVE;
	if (iut_enable() != SUCCESS)
		return INCONCLUSIVE;
	start_tt(MAXIMUM_WAIT);
	return SUCCESS;
}
static int link_out_of_service(void)
{
	show_msus = 1;
	show_fisus = 1;
	show_timeout = 0;
	pt_bib = pt_fib = iut_bib = iut_fib = 0x0;
	pt_bsn = pt_fsn = iut_bsn = iut_fsn = 0x0;
	if (mgm_open() != SUCCESS)
		return INCONCLUSIVE;
	if (pt_open() != SUCCESS)
		return INCONCLUSIVE;
	if (iut_open() != SUCCESS)
		return INCONCLUSIVE;
	if (iut_connect() != SUCCESS)
		return INCONCLUSIVE;
	if (iut_m2pa_push() != SUCCESS)
		return INCONCLUSIVE;
	if (iut_enable() != SUCCESS)
		return INCONCLUSIVE;
	if (signal(POWER_ON) != SUCCESS)
		return INCONCLUSIVE;
	start_tt(MAXIMUM_WAIT);
	return SUCCESS;
}
static int link_in_service(void)
{
	if (link_out_of_service() != SUCCESS)
		return INCONCLUSIVE;
	for (;;) {
		switch (state) {
		case 0:
			switch ((event = get_event())) {
			case OUT_OF_SERVICE:
				send(POWER_ON);
				send(OUT_OF_SERVICE);
				signal(START);
				state = 1;
				break;
			default:
				return INCONCLUSIVE;
			}
			break;
		case 1:
			switch ((event = get_event())) {
			case ALIGNMENT:
				send(START);
				send(ALIGNMENT);
				state = 2;
				break;
			default:
				return INCONCLUSIVE;
			}
			break;
		case 2:
			switch ((event = get_event())) {
			case PROVING_NORMAL:
				send(PROVING_EMERG);
				start_tt(iutconf.sl.t4e * 10 + 200);
				state = 3;
				break;
			default:
				return INCONCLUSIVE;
			}
			break;
		case 3:
			switch ((event = get_event())) {
#if defined(M2PA_VERSION_DRAFT3)||defined(M2PA_VERSION_DRAFT3_1)
			case PROVING:
				send(PROVING);
				break;
#else
			case PROVING_NORMAL:
				send(PROVING_EMERG);
				break;
#endif
			case IN_SERVICE:
				send(IN_SERVICE);
				break;
			case IUT_IN_SERVICE:
				start_tt(MAXIMUM_WAIT);
				return SUCCESS;
			default:
				return INCONCLUSIVE;
			}
			break;
		default:
			return INCONCLUSIVE;
		}
	}
	return INCONCLUSIVE;
}
static int link_in_service_basic(void)
{
	iut_options = 0;
	return link_in_service();
}
static int link_in_service_pcr(void)
{
//      iut_options = SS7_POPT_PCR;
	return link_in_service();
}

/*
 *  =========================================================================
 *
 *  TEST CASE Lists
 *
 *  =========================================================================
 */
typedef struct test_case {
	int (*test) (void);			/* test case function */
	int (*precond) (void);			/* test preconditions */
	char *title;				/* title of the test case */
} test_case_t;

static test_case_t test_suite[] = {
	{test_1_1a, link_power_off,
	 "Q.781/Test 1.1(a)\n" "Link State Control - Expected signal units/orders\n" "Initialization (Power-up)\n"}
	,
	{test_1_1b, link_out_of_service,
	 "Q.781/Test 1.1(b)\n" "Link State Control - Expected signal units/orders\n" "Initialization (Power-up)\n"}
	,
	{test_1_2, link_out_of_service,
	 "Q.781/Test 1.2\n" "Link State Control - Expected signal units/orders\n" "Timer T2\n"}
	,
	{test_1_3, link_out_of_service,
	 "Q.781/Test 1.3\n" "Link State Control - Expected signal units/orders\n" "Timer T3\n"}
	,
	{test_1_4, link_out_of_service,
	 "Q.781/Test 1.4\n" "Link State Control - Expected signal units/orders\n" "Timer T1 & Timer T4 (Normal)\n"}
	,
	{test_1_5a, link_out_of_service,
	 "Q.781/Test 1.5(a)\n" "Link State Control - Expected signal units/orders\n"
	 "Normal alignment procedure\n"}
	,
	{test_1_5b, link_out_of_service,
	 "Q.781/Test 1.5(b)\n" "Link State Control - Expected signal units/orders\n"
	 "Normal alignment procedure\n"}
	,
	{test_1_6, link_out_of_service,
	 "Q.781/Test 1.6\n" "Link State Control - Expected signal units/orders\n"
	 "Normal alignment procedure - correct procedure (MSU)\n"}
	,
	{test_1_7, link_out_of_service,
	 "Q.781/Test 1.7\n" "Link State Control - Expected signal units/orders\n"
	 "SIO received during normal proving period\n"}
	,
	{test_1_8a, link_out_of_service,
	 "Q.781/Test 1.8(a)\n" "Link State Control - Expected signal units/orders\n"
	 "Normal alignment with PO set (FISU)\n"}
	,
	{test_1_8b, link_out_of_service,
	 "Q.781/Test 1.8(b)\n" "Link State Control - Expected signal units/orders\n"
	 "Normal alignment with PO set (FISU)\n"}
	,
	{test_1_9a, link_out_of_service,
	 "Q.781/Test 1.9(a)\n" "Link State Control - Expected signal units/orders\n"
	 "Normal alignment with PO set (MSU)\n"}
	,
	{test_1_9b, link_out_of_service,
	 "Q.781/Test 1.9(b)\n" "Link State Control - Expected signal units/orders\n"
	 "Normal alignment with PO set (MSU)\n"}
	,
	{test_1_10, link_out_of_service,
	 "Q.781/Test 1.10\n" "Link State Control - Expected signal units/orders\n"
	 "Normal alignment with PO set and cleared\n"}
	,
	{test_1_11, link_out_of_service,
	 "Q.781/Test 1.11\n" "Link State Control - Expected signal units/orders\n"
	 "Set RPO when \"Aligned not ready\"\n"}
	,
	{test_1_12a, link_out_of_service,
	 "Q.781/Test 1.12(a)\n" "Link State Control - Expected signal units/orders\n"
	 "SIOS received when \"Aligned not ready\"\n"}
	,
	{test_1_12b, link_out_of_service,
	 "Q.781/Test 1.12(b)\n" "Link State Control - Expected signal units/orders\n"
	 "SIOS received when \"Aligned not ready\"\n"}
	,
	{test_1_13, link_out_of_service,
	 "Q.781/Test 1.13\n" "Link State Control - Expected signal units/orders\n"
	 "SIO received when \"Aligned not ready\"\n"}
	,
	{test_1_14, link_out_of_service,
	 "Q.781/Test 1.14\n" "Link State Control - Expected signal units/orders\n"
	 "Set and clear LPO when \"Initial alignment\"\n"}
	,
	{test_1_15, link_out_of_service,
	 "Q.781/Test 1.15\n" "Link State Control - Expected signal units/orders\n"
	 "Set and clear LPO when \"Aligned ready\"\n"}
	,
	{test_1_16, link_out_of_service,
	 "Q.781/Test 1.16\n" "Link State Control - Expected signal units/orders\n"
	 "Timer T1 in \"Aligned not ready\" state\n"}
	,
	{test_1_17, link_out_of_service,
	 "Q.781/Test 1.17\n" "Link State Control - Expected signal units/orders\n"
	 "No SIO sent during normal proving period\n"}
	,
	{test_1_18, link_out_of_service,
	 "Q.781/Test 1.18\n" "Link State Control - Expected signal units/orders\n"
	 "Set and cease emergency prior to \"start alignment\"\n"}
	,
	{test_1_19, link_out_of_service,
	 "Q.781/Test 1.19\n" "Link State Control - Expected signal units/orders\n"
	 "Set emergency while in \"not aligned state\"\n"}
	,
	{test_1_20, link_out_of_service,
	 "Q.781/Test 1.20\n" "Link State Control - Expected signal units/orders\n"
	 "Set emergency when \"aligned\"\n"}
	,
	{test_1_21, link_out_of_service,
	 "Q.781/Test 1.21\n" "Link State Control - Expected signal units/orders\n" "Both ends set emergency.\n"}
	,
	{test_1_22, link_out_of_service,
	 "Q.781/Test 1.22\n" "Link State Control - Expected signal units/orders\n"
	 "Individual end sets emergency\n"}
	,
	{test_1_23, link_out_of_service,
	 "Q.781/Test 1.23\n" "Link State Control - Expected signal units/orders\n"
	 "Set emergency during normal proving\n"}
	,
	{test_1_24, link_out_of_service,
	 "Q.781/Test 1.24\n" "Link State Control - Expected signal units/orders\n"
	 "No SIO send during emergency alignment\n"}
	,
	{test_1_25, link_out_of_service,
	 "Q.781/Test 1.25\n" "Link State Control - Expected signal units/orders\n"
	 "Deactivation duing intial alignment\n"}
	,
	{test_1_26, link_out_of_service,
	 "Q.781/Test 1.26\n" "Link State Control - Expected signal units/orders\n"
	 "Deactivation during aligned state\n"}
	,
	{test_1_27, link_out_of_service,
	 "Q.781/Test 1.27\n" "Link State Control - Expected signal units/orders\n"
	 "Deactivation during aligned not ready\n"}
	,
	{test_1_28, link_in_service_basic,
	 "Q.781/Test 1.28\n" "Link State Control - Expected signal units/orders\n"
	 "SIO received during link in service\n"}
	,
	{test_1_29a, link_in_service_basic,
	 "Q.781/Test 1.29(a)\n" "Link State Control - Expected signal units/orders\n"
	 "SIO received during link in service\n"}
	,
	{test_1_29b, link_in_service_basic,
	 "Q.781/Test 1.29(b)\n" "Link State Control - Expected signal units/orders\n"
	 "SIO received during link in service\n"}
	,
	{test_1_30a, link_in_service_basic,
	 "Q.781/Test 1.30(a)\n" "Link State Control - Expected signal units/orders\n" "Deactivation during LPO\n"}
	,
	{test_1_30b, link_in_service_basic,
	 "Q.781/Test 1.30(b)\n" "Link State Control - Expected signal units/orders\n" "Deactivation during LPO\n"}
	,
	{test_1_31a, link_in_service_basic,
	 "Q.781/Test 1.31(a)\n" "Link State Control - Expected signal units/orders\n" "Deactivation during RPO\n"}
	,
	{test_1_31b, link_in_service_basic,
	 "Q.781/Test 1.31(b)\n" "Link State Control - Expected signal units/orders\n" "Deactivation during RPO\n"}
	,
	{test_1_32a, link_out_of_service,
	 "Q.781/Test 1.32(a)\n" "Link State Control - Expected signal units/orders\n"
	 "Deactivation during the proving period\n"}
	,
	{test_1_32b, link_out_of_service,
	 "Q.781/Test 1.32(b)\n" "Link State Control - Expected signal units/orders\n"
	 "Deactivation during the proving period\n"}
	,
	{test_1_33, link_out_of_service,
	 "Q.781/Test 1.33\n" "Link State Control - Expected signal units/orders\n"
	 "SIO received instead of FISUs\n"}
	,
	{test_1_34, link_out_of_service,
	 "Q.781/Test 1.34\n" "Link State Control - Expected signal units/orders\n"
	 "SIO received instead of FISUs\n"}
	,
	{test_1_35, link_out_of_service,
	 "Q.781/Test 1.35\n" "Link State Control - Expected signal units/orders\n"
	 "SIPO received instead of FISUs\n"}
	,
	{test_2_1, link_out_of_service,
	 "Q.781/Test 2.1\n" "Link State Control - Unexpected signal units/orders\n"
	 "Unexpected signal units/orders in \"Out of service\" state\n"}
	,
	{test_2_2, link_out_of_service,
	 "Q.781/Test 2.2\n" "Link State Control - Unexpected signal units/orders\n"
	 "Unexpected signal units/orders in \"Not Aligned\" state\n"}
	,
	{test_2_3, link_out_of_service,
	 "Q.781/Test 2.3\n" "Link State Control - Unexpected signal units/orders\n"
	 "Unexpected signal units/orders in \"Aligned\" state\n"}
	,
	{test_2_4, link_out_of_service,
	 "Q.781/Test 2.4\n" "Link State Control - Unexpected signal units/orders\n"
	 "Unexpected signal units/orders in \"Proving\" state\n"}
	,
	{test_2_5, link_out_of_service,
	 "Q.781/Test 2.5\n" "Link State Control - Unexpected signal units/orders\n"
	 "Unexpected signal units/orders in \"Aligned Ready\" state\n"}
	,
	{test_2_6, link_out_of_service,
	 "Q.781/Test 2.6\n" "Link State Control - Unexpected signal units/orders\n"
	 "Unexpected signal units/orders in \"Aligned Not Ready\" state\n"}
	,
	{test_2_7, link_in_service_basic,
	 "Q.781/Test 2.7\n" "Link State Control - Unexpected signal units/orders\n"
	 "Unexpected signal units/orders in \"In Service\" state\n"}
	,
	{test_2_8, link_in_service_basic,
	 "Q.781/Test 2.8\n" "Link State Control - Unexpected signal units/orders\n"
	 "Unexpected signal units/orders in \"Processor Outage\" state\n"}
	,
	{test_3_1, link_out_of_service,
	 "Q.781/Test 3.1\n" "Transmission Failure\n" "Link aligned ready (Break Tx path)\n"}
	,
	{test_3_2, link_in_service_basic,
	 "Q.781/Test 3.2\n" "Transmission Failure\n" "Link aligned ready (Corrupt FIBs - Basic)\n"}
	,
	{test_3_3, link_out_of_service,
	 "Q.781/Test 3.3\n" "Transmission Failure\n" "Link aligned not ready (Break Tx path)\n"}
	,
	{test_3_4, link_out_of_service,
	 "Q.781/Test 3.4\n" "Transmission Failure\n" "Link aligned not ready (Corrupt FIBs - Basic)\n"}
	,
	{test_3_5, link_in_service_basic,
	 "Q.781/Test 3.5\n" "Transmission Failure\n" "Link in service (Break Tx path)\n"}
	,
	{test_3_6, link_in_service_basic,
	 "Q.781/Test 3.6\n" "Transmission Failure\n" "Link in service (Corrupt FIBs - Basic)\n"}
	,
	{test_3_7, link_in_service_basic,
	 "Q.781/Test 3.7\n" "Transmission Failure\n" "Link in processor outage (Break Tx path)\n"}
	,
	{test_3_8, link_in_service_basic,
	 "Q.781/Test 3.8\n" "Transmission Failure\n" "Link in processor outage (Corrupt FIBs - Basic)\n"}
	,
	{test_4_1, link_in_service_basic,
	 "Q.781/Test 4.1\n" "Processor Outage Control\n" "Set and clear LPO while link in service\n"}
	,
	{test_4_2, link_in_service_basic,
	 "Q.781/Test 4.2\n" "Processor Outage Control\n" "RPO during LPO\n"}
	,
	{test_4_3, link_in_service_basic,
	 "Q.781/Test 4.3\n" "Processor Outage Control\n" "Clear LPO when \"Both processor outage\"\n"}
	,
	{test_5_1, link_in_service_basic,
	 "Q.781/Test 5.1\n" "SU delimitation, alignment, error detection and correction\n"
	 "More than 7 ones between MSU opening and closing flags\n"}
	,
	{test_5_2, link_in_service_basic,
	 "Q.781/Test 5.2\n" "SU delimitation, alignment, error detection and correction\n"
	 "Greater than maximum signal unit length\n"}
	,
	{test_5_3, link_in_service_basic,
	 "Q.781/Test 5.3\n" "SU delimitation, alignment, error detection and correction\n"
	 "Below minimum signal unit length\n"}
	,
	{test_5_4a, link_in_service_basic,
	 "Q.781/Test 5.4(a)\n" "SU delimitation, alignment, error detection and correction\n"
	 "Reception of single and multiple flags between FISUs\n"}
	,
	{test_5_4b, link_in_service_basic,
	 "Q.781/Test 5.4(b)\n" "SU delimitation, alignment, error detection and correction\n"
	 "Reception of single and multiple flags between FISUs\n"}
	,
	{test_5_5a, link_in_service_basic,
	 "Q.781/Test 5.5(a)\n" "SU delimitation, alignment, error detection and correction\n"
	 "Reception of single and multiple flags between MSUs\n"}
	,
	{test_5_5b, link_in_service_basic,
	 "Q.781/Test 5.5(b)\n" "SU delimitation, alignment, error detection and correction\n"
	 "Reception of single and multiple flags between MSUs\n"}
	,
	{test_6_1, link_in_service_basic,
	 "Q.781/Test 6.1\n" "SUERM check\n" "Error rate of 1 in 256 - Link remains in service\n"}
	,
	{test_6_2, link_in_service_basic,
	 "Q.781/Test 6.2\n" "SUERM check\n" "Error rate of 1 in 254 - Link out of service\n"}
	,
	{test_6_3, link_in_service_basic,
	 "Q.781/Test 6.3\n" "SUERM check\n" "Consequtive corrupt SUs\n"}
	,
	{test_6_4, link_in_service_basic,
	 "Q.781/Test 6.4\n" "SUERM check\n" "Time controlled break of the link\n"}
	,
	{test_7_1, link_out_of_service,
	 "Q.781/Test 7.1\n" "AERM check\n" "Error rate below the normal threshold\n"}
	,
	{test_7_2, link_out_of_service,
	 "Q.781/Test 7.2\n" "AERM check\n" "Error rate at the normal threshold\n"}
	,
	{test_7_3, link_out_of_service,
	 "Q.781/Test 7.3\n" "AERM check\n" "Error rate above the normal threshold\n"}
	,
	{test_7_4, link_out_of_service,
	 "Q.781/Test 7.4\n" "AERM check\n" "Error rate at the emergency threshold\n"}
	,
	{test_8_1, link_in_service_basic,
	 "Q.781/Test 8.1\n" "Transmission and reception control (Basic)\n" "MSU transmission and reception\n"}
	,
	{test_8_2, link_in_service_basic,
	 "Q.781/Test 8.2\n" "Transmission and reception control (Basic)\n" "Negative acknowledgement of an MSU\n"}
	,
	{test_8_3, link_in_service_basic,
	 "Q.781/Test 8.3\n" "Transmission and reception control (Basic)\n" "Check RTB full\n"}
	,
	{test_8_4, link_in_service_basic,
	 "Q.781/Test 8.4\n" "Transmission and reception control (Basic)\n" "Single MSU with erroneous FIB\n"}
	,
	{test_8_5, link_in_service_basic,
	 "Q.781/Test 8.5\n" "Transmission and reception control (Basic)\n" "Duplicated FSN\n"}
	,
	{test_8_6, link_in_service_basic,
	 "Q.781/Test 8.6\n" "Transmission and reception control (Basic)\n"
	 "Erroneous retransmission - Single MSU\n"}
	,
	{test_8_7, link_in_service_basic,
	 "Q.781/Test 8.7\n" "Transmission and reception control (Basic)\n"
	 "Erroneous retransmission - Multiple FISUs\n"}
	,
	{test_8_8, link_in_service_basic,
	 "Q.781/Test 8.8\n" "Transmission and reception control (Basic)\n" "Single FISU with corrupt FIB\n"}
	,
	{test_8_9, link_in_service_basic,
	 "Q.781/Test 8.9\n" "Transmission and reception control (Basic)\n" "Single FISU prior to RPO being set\n"}
	,
	{test_8_10, link_in_service_basic,
	 "Q.781/Test 8.10\n" "Transmission and reception control (Basic)\n" "Abnormal BSN - single MSU\n"}
	,
	{test_8_11, link_in_service_basic,
	 "Q.781/Test 8.11\n" "Transmission and reception control (Basic)\n"
	 "Abnormal BSN - two consecutive FISUs\n"}
	,
	{test_8_12, link_in_service_basic,
	 "Q.781/Test 8.12\n" "Transmission and reception control (Basic)\n" "Excessive delay of acknowledgement\n"}
	,
	{test_8_13, link_in_service_basic,
	 "Q.781/Test 8.13\n" "Transmission and reception control (Basic)\n" "Level 3 Stop command\n"}
	,
	{test_9_1, link_in_service_pcr,
	 "Q.781/Test 9.1\n" "Transmission and reception control (PCR)\n" "MSU transmission and reception\n"}
	,
	{test_9_2, link_in_service_pcr,
	 "Q.781/Test 9.2\n" "Transmission and reception control (PCR)\n" "Priority control\n"}
	,
	{test_9_3, link_in_service_pcr,
	 "Q.781/Test 9.3\n" "Transmission and reception control (PCR)\n"
	 "Forced retransmission with the value N1\n"}
	,
	{test_9_4, link_in_service_pcr,
	 "Q.781/Test 9.4\n" "Transmission and reception control (PCR)\n"
	 "Forced retransmission with the value N2\n"}
	,
	{test_9_5, link_in_service_pcr,
	 "Q.781/Test 9.5\n" "Transmission and reception control (PCR)\n" "Forced retransmission cancel\n"}
	,
	{test_9_6, link_in_service_pcr,
	 "Q.781/Test 9.6\n" "Transmission and reception control (PCR)\n" "Reception of forced retransmission\n"}
	,
	{test_9_7, link_in_service_pcr,
	 "Q.781/Test 9.7\n" "Transmission and reception control (PCR)\n" "MSU transmission while RPO set\n"}
	,
	{test_9_8, link_in_service_pcr,
	 "Q.781/Test 9.8\n" "Transmission and reception control (PCR)\n" "Abnormal BSN - Single MSU\n"}
	,
	{test_9_9, link_in_service_pcr,
	 "Q.781/Test 9.9\n" "Transmission and reception control (PCR)\n" "Abnormal BSN - Two MSUs\n"}
	,
	{test_9_10, link_in_service_pcr,
	 "Q.781/Test 9.10\n" "Transmission and reception control (PCR)\n" "Unexpected FSN\n"}
	,
	{test_9_11, link_in_service_pcr,
	 "Q.781/Test 9.11\n" "Transmission and reception control (PCR)\n" "Excessive delay of acknowledgement\n"}
	,
	{test_9_12, link_in_service_pcr,
	 "Q.781/Test 9.12\n" "Transmission and reception control (PCR)\n" "FISU with FSN expected for MSU\n"}
	,
	{test_9_13, link_in_service_pcr,
	 "Q.781/Test 9.13\n" "Transmission and reception control (PCR)\n" "Level 3 Stop command\n"}
	,
	{test_10_1, link_in_service_basic,
	 "Q.781/Test 10.1\n" "Congestion Control\n" "Congestion abatement\n"}
	,
	{test_10_2, link_in_service_basic,
	 "Q.781/Test 10.2\n" "Congestion Control\n" "Timer T7\n"}
	,
	{test_10_3, link_in_service_basic,
	 "Q.781/Test 10.3\n" "Congestion Control\n" "Timer T6\n"}
};

static int run_test(test_case_t * tcase)
{
	int ret = 0;
	printf(tcase->title);
	fflush(stdout);
//      ioctl( pt_fd, I_FLUSH, FLUSHRW);    /* flush Protocol Tester (PT) */
	state = 0;
	event = 0;
	count = 0;
	tries = 0;
	beg_time = 0;
	expand = 0;
	oldmsg = 0;
	cntmsg = 0;
	oldpsb = 0;
	oldact = 0;
	cntact = 0;
	oldret = 0;
	cntret = 0;
	oldisb = 0;
	oldprm = 0;
	cntprm = 0;
	oldmgm = 0;
	cntmgm = 0;
	msu_len = MSU_LEN;
	printf("Precondition                                                        \n");
	printf("                                                                    \n");
	FFLUSH(stdout);
	if ((ret = (*tcase->precond) ()) == SUCCESS) {
		state = 0;
		event = 0;
		count = 0;
		tries = 0;
		beg_time = 0;
		expand = 1;
		printf("                                                                    \n");
		printf("Test Case                                                           \n");
		printf("                                                                    \n");
		FFLUSH(stdout);
		ret = (*tcase->test) ();
	}
	switch (ret) {
	case SUCCESS:
		printf("                                                                    \n");
		printf("                         =====SUCCESS======                         \n");
		break;
	case FAILURE:
		printf("                                                                    \n");
		printf("                         +++++FAILURE++++++                         \n");
		break;
	case INCONCLUSIVE:
		printf("                                                                    \n");
		printf("                         ???INCONCLUSIVE???                         \n");
		break;
	case NOTAPPLICABLE:
		printf("                                                                    \n");
		printf("                         xxNOT-APPLICABLExx                         \n");
		break;
	default:
		printf("                                                                    \n");
		printf("                         ******ERROR*******                         \n");
		break;
	}
	printf("                                                                    \n");
	printf("Postcondition                                                       \n");
	printf("                                                                    \n");
	FFLUSH(stdout);
	iut_power_off();
	printf("                                                                    \n");
	printf("Done                                                                \n");
	return ret;
}

int main(void)
{
	int i;
	int retry = 0;
	int failed = 0, passed = 0, inconc = 0, notappl = 0, errored = 0;
	verbose = 0;
	expand = 1;
	show_msus = 1;
	show_fisus = 1;
	show_timeout = 1;
	for (i = 0; i < sizeof(test_suite) / sizeof(test_case_t); i++) {
		printf("\n");
		FFLUSH(stdout);
		switch (run_test(&test_suite[i])) {
		case FAILURE:
			if (!retry)
				failed++;
			printf("\n");
			printf("********\n");
			printf
			    ("******** FAILURE(%d) - test case failed in state %d with event %d.\n",
			     state, state, event);
			printf("********\n\n");
			fflush(stdout);
			if (!retry) {
				retry = 1;
				verbose = 1;
				i--;
				continue;
			} else {
				retry = 0;
				verbose = 0;
				break;
			}
			break;
		case SUCCESS:
			passed++;
			printf("\n");
			printf("********\n");
			printf("******** SUCCESS - test case successful.\n");
			printf("********\n\n");
			break;
		case INCONCLUSIVE:
			if (!retry)
				inconc++;
			printf("\n");
			printf("********\n");
			printf
			    ("******** INCONCLUSIVE(%d) - test case inconclusive in state %d with event %d.\n",
			     state, state, event);
			printf("********\n\n");
			fflush(stdout);
			if (!retry) {
				retry = 1;
				verbose = 1;
				i--;
				continue;
			} else {
				retry = 0;
				verbose = 0;
				break;
			}
			break;
		case NOTAPPLICABLE:
			notappl++;
			printf("\n");
			printf("********\n");
			printf("******** NOT APPLICABLE - test case does not apply.\n");
			printf("********\n\n");
			break;
		case SCRIPTERROR:
		default:
			if (!retry)
				errored++;
			printf("\n");
			printf("********\n");
			printf
			    ("******** ERROR(%d) - test case completed in error in state %d with event %d.\n",
			     state, state, event);
			printf("********\n\n");
			fflush(stdout);
			if (!retry) {
				retry = 1;
				verbose = 1;
				i--;
				continue;
			} else {
				retry = 0;
				verbose = 0;
				break;
			}
			break;
		}
		// if ( failed || inconc || errored ) break;
	}
	printf("Test Suite Summary:\n");
	printf("    Failed         %3d\n", failed);
	printf("    Passed         %3d\n", passed);
	printf("    Inconclusive   %3d\n", inconc);
	printf("    Not Applicable %3d\n", notappl);
	printf("    Errors         %3d\n", errored);
	printf("\n");
	FFLUSH(stdout);
	return (0);
}


Home Index Prev Next More Download Info FAQ Mail   Home -> Resources -> Browse Source -> strss7/test/test-m2pa.c

OpenSS7
SS7 for the
Common Man
Home Overview Status News Documentation Resources About

© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved.
Last modified: