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/drivers/ua/ua_tsp.c


File /code/strss7/drivers/ua/ua_tsp.c



#ident "@(#) $RCSfile: ua_tsp.c,v $ $Name:  $($Revision: 0.8.2.1 $) $Date: 2002/10/18 02:26:20 $"

static char const ident[] =
    "$RCSfile: ua_tsp.c,v $ $Name:  $($Revision: 0.8.2.1 $) $Date: 2002/10/18 02:26:20 $";

/*
 *  =========================================================================
 *
 *  T-Provider --> UA (Upstream primitives received from downstream)
 *
 *  =========================================================================
 */
/*
 *  T_CONN_IND     11 - connection indication
 *  -------------------------------------------------------------------------
 *  We should not be getting connection indications.  Notify management and
 *  let it decide what to do with the stream.  We should unlink and abort the
 *  stream so that management can talk directly to the stream.
 */
static int tsp_conn_ind(queue_t * q, mblk_t * pdu)
{
	int err;
	/* notify management */
	if ((err = m_link_ind(q, pdu)))
		return (err);
	/* 
	 *  FIXME: abort and unlink the stream...
	 */
	freemsg(pdu);
	return (0);
}

/*
 *  T_CONN_CON     12 - connection confirmation
 *  -------------------------------------------------------------------------
 *  We should not be getting connection confirmations. Notify management and
 *  let it decide what to do with the stream.  We should unlink and abort the
 *  stream so that management can talk directly to the stream.
 */
static int tsp_conn_con(queue_t * q, mblk_t * pdu)
{
	int err;
	/* notify management */
	if ((err = m_link_ind(q, pdu)))
		return (err);
	/* 
	 *  FIXME: abort and unlink the stream...
	 */
	freemsg(pdu);
	return (0);
}

/*
 *  T_DISCON_IND   13 - disconnect indication
 *  -------------------------------------------------------------------------
 *  The other end has gone bye-bye.  Unlink and abort the stream so that
 *  management can attempt reconnection if necessary.
 */
static int tsp_discon_ind(queue_t * q, mblk_t * pdu)
{
	int err;
	if ((err = m_link_ind(q, pdu)))
		return (err);
	/* 
	 *  FIXME: abort and unlink the stream...
	 */
	freemsg(pdu);
	return (0);
}

/*
 *  T_DATA_IND     14 - data indication
 *  -------------------------------------------------------------------------
 *  This is translated into UA messages and fed to the state machines.
 *  FIXME: this function is not memory exhaustion safe...
 */
static int tsp_data_ind(queue_t * q, mblk_t * pdu)
{
	mblk_t *dp;
	sp_t *sp = ((lp_t *) q->q_ptr)->u.sp;
	struct T_data_ind *p = (struct T_data_ind *) pdu->b_rptr;
	if (p->MORE_flag) {
		/* we are reassembling at the SP */
		if (sp->reassem)
			linkb(sp->reassem, pdu->b_cont);
		else
			sp->reassem = pdu->b_cont;
		freeb(pdu);
		return (0);
	}
	if (sp->reassem) {
		/* we are completing a reassembly at the SP */
		linkb(sp->reassem, pdu->b_cont);
		dp = sp->reassem;
		sp->reassem = NULL;
	} else {
		dp = pdu->b_cont;
	}
	dp->b_band = 0;
	if ((err = ua_recv_msg(q, dp)))
		return (err);
	freeb(pdu);
	return (0);
}

/*
 *  T_EXDATA_IND   15 - expedited data indication
 *  -------------------------------------------------------------------------
 *  This is translated into UA messages and fed to the state machines.
 *  FIXME: this function is not memory exhaustion safe...
 */
static int tsp_exdata_ind(queue_t * q, mblk_t * pdu)
{
	mblk_t *dp;
	sp_t *sp = ((lp_t *) q->q_ptr)->u.sp;
	struct T_exdata_ind *p = (struct T_exdata_ind *) pdu->b_rptr;
	if (p->MORE_flag) {
		/* reassembling exdata at the SP */
		if (sp->exassem)
			linkb(sp->reassem, pdu->b_cont);
		else
			sp->exassem = pdu->b_cont;
		freeb(pdu);
		return (0);
	}
	if (sp->exassem) {
		/* we are completing a reassembly at the SP */
		linkb(sp->exassem, pdu->b_cont);
		dp = sp->exassem;
		sp->exassem = NULL;
	} else {
		dp = pdu->b_cont;
	}
	dp->b_band = 1;
	if ((err = ua_recv_msg(q, dp)))
		return (err);
	freeb(pdu);
	return (0);
}

/*
 *  T_INFO_ACK     16 - information acknowledgement
 *  -------------------------------------------------------------------------
 */
static int tsp_info_ack(queue_t * q, mblk_t * pdu)
{
	/* 
	 *  NOTE:- We might later want to copy out some of the pertinent
	 *  information for ourselves.
	 */
	/* give it to management */
	return m_link_ind(q, pdu);
}

/*
 *  T_BIND_ACK     17 - bind acknowledgement
 *  -------------------------------------------------------------------------
 */
static int tsp_bind_ack(queue_t * q, mblk_t * pdu)
{
	/* 
	 *  NOTE:- We might later want to copy out some of the pertinent
	 *  information for ourselves.
	 */
	/* give it to management */
	return m_link_ind(q, pdu);
}

/*
 *  T_ERROR_ACK    18 - error acknowledgement
 *  -------------------------------------------------------------------------
 */
static int tsp_error_ack(queue_t * q, mblk_t * pdu)
{
	/* 
	 *  FIXME:  We should check what state we are in and decide what
	 *  actions should be taken.  Most often we will probably need to shut
	 *  down the SP, abort the connection and unlink the stream.
	 */
	/* give it to management */
	return m_link_ind(q, pdu);
}

/*
 *  T_OK_ACK       19 - ok acknowledgement
 *  -------------------------------------------------------------------------
 */
static int tsp_ok_ack(queue_t * q, mblk_t * pdu)
{
	/* 
	 *  FIXME:  We should check what state we are in and decide what
	 *  actions should be taken.  Most often we will probably need to shut
	 *  down the SP, abort the connection and unlink the stream.
	 */
	/* give it to management */
	return m_link_ind(q, pdu);
}

/*
 *  T_UNITDATA_IND 20 - unitdata indication
 *  -------------------------------------------------------------------------
 *  I don't know why we would get these, but maybe this is a connection-less
 *  transport which is sequenced...
 */
static int tsp_unitdata_ind(queue_t * q, mblk_t * pdu)
{
	int err;
	mblk_t *dp;
	dp = pdu->b_cont;
	dp->b_band = 0;
	freeb(pdu);
	if ((err = ua_recv_msg(q, dp)))
		return (err);
	return (0);
}

/*
 *  T_UDERROR_IND  21 - unitdata error indication
 *  -------------------------------------------------------------------------
 */
static int tsp_uderror_ind(queue_t * q, mblk_t * pdu)
{
	(void) q;
	(void) pdu;
	/* FIXME */
	return (-EFAULT);
}

/*
 *  T_OPTMGMT_ACK  22 - options management acknowledgement
 *  -------------------------------------------------------------------------
 */
static int tsp_optmgmt_ack(queue_t * q, mblk_t * pdu)
{
	(void) q;
	(void) pdu;
	/* FIXME */
	return (-EFAULT);
}

/*
 *  T_ORDREL_IND   23 - orderly release indication
 *  -------------------------------------------------------------------------
 */
static int tsp_ordrel_ind(queue_t * q, mblk_t * pdu)
{
	(void) q;
	(void) pdu;
	/* FIXME */
	return (-EFAULT);
}

/*
 *  T_OPTDATA_IND  26 - data with options indication
 *  -------------------------------------------------------------------------
 */
static int tsp_optdata_ind(queue_t * q, mblk_t * pdu)
{
	(void) q;
	(void) pdu;
	/* FIXME */
	return (-EFAULT);
}

/*
 *  T_ADDR_ACK     27 - address acknowledgement
 *  -------------------------------------------------------------------------
 */
static int tsp_addr_ack(queue_t * q, mblk_t * pdu)
{
	(void) q;
	(void) pdu;
	/* FIXME */
	return (-EFAULT);
}

static int (*tsp_prim[]) (queue_t *, mblk_t *) = {
	NULL,			/* T_CONN_REQ 0 - connection request */
	    NULL,		/* T_CONN_RES 1 - connection response */
	    NULL,		/* T_DISCON_REQ 2 - disconnect request */
	    NULL,		/* T_DATA_REQ 3 - data request */
	    NULL,		/* T_EXDATA_REQ 4 - expedited data request */
	    NULL,		/* T_INFO_REQ 5 - information request */
	    NULL,		/* T_BIND_REQ 6 - bind request */
	    NULL,		/* T_UNBIND_REQ 7 - unbind request */
	    NULL,		/* T_UNITDATA_REQ 8 - unitdata request */
	    NULL,		/* T_OPTMGMT_REQ 9 - options management request */
	    NULL,		/* T_ORDREL_REQ 10 - orderly release request */
#define TSP_USTR_FIRST T_CONN_IND
	    tsp_conn_ind,	/* T_CONN_IND 11 - connection indication */
	    tsp_conn_con,	/* T_CONN_CON 12 - connection confirmation */
	    tsp_discon_ind,	/* T_DISCON_IND 13 - disconnect indication */
	    tsp_data_ind,	/* T_DATA_IND 14 - data indication */
	    tsp_exdata_ind,	/* T_EXDATA_IND 15 - expedited data indication */
	    tsp_info_ack,	/* T_INFO_ACK 16 - information acknowledgement */
	    tsp_bind_ack,	/* T_BIND_ACK 17 - bind acknowledgement */
	    tsp_error_ack,	/* T_ERROR_ACK 18 - error acknowledgement */
	    tsp_ok_ack,		/* T_OK_ACK 19 - ok acknowledgement */
	    tsp_unitdata_ind,	/* T_UNITDATA_IND 20 - unitdata indication */
	    tsp_uderror_ind,	/* T_UDERROR_IND 21 - unitdata error indication */
	    tsp_optmgmt_ack,	/* T_OPTMGMT_ACK 22 - options management acknowledgement */
	    tsp_ordrel_ind,	/* T_ORDREL_IND 23 - orderly release indication */
	    NULL,		/* T_OPTDATA_REQ 24 - data with options request */
	    NULL,		/* T_ADDR_REQ 25 - address request */
	    tsp_optdata_ind,	/* T_OPTDATA_IND 26 - data with options indication */
	    tsp_addr_ack	/* T_ADDR_ACK 27 - address acknowledgement */
#define TSP_USTR_LAST  T_ADDR_ACK
};

/*
 *  =========================================================================
 *
 *  M_DATA Processing
 *
 *  =========================================================================
 */
int tsp_r_data(queue_t * q, mblk_t * msg)
{
	(void) q;
	(void) msg;
	return (-EOPNOTSUPP);
}

/*
 *  =========================================================================
 *
 *  M_PROTO, M_PCPROTO Processing
 *
 *  =========================================================================
 */
int tsp_r_proto(queue_t * q, mblk_t * msg)
{
	int prim = *((t_scalar_t *) msg->b_rptr);
	if (0 <= prim && prim < sizeof(tsp_prim) / sizeof(int (*)(void)) && tsp_prim[prim])
		return ((*tsp_prim[prim]) (q, msg));
	return (-EOPNOTSUPP);
}

/*
 *  =========================================================================
 *
 *  M_CTL Processing
 *
 *  =========================================================================
 */
int tsp_r_ctl(queue_t * q, mblk_t * msg)
{
	(void) q;
	(void) msg;
	return (-EOPNOTSUPP);
}

/*
 *  =========================================================================
 *
 *  M_ERROR Processing
 *
 *  =========================================================================
 *  This transport stream is toast.  We have to inform management that this
 *  transport stream (with this muxid) has errored out.  We need to inform the
 *  AS or SG that this SGP or ASP is dead and let the AS or SG recalculate the
 *  state of the AS(s) associated with this transport stream.
 */
int tsp_r_error(queue_t * q, mblk_t * msg)
{
	int err;
	sp_t *sp = ((lp_t *) q->q_ptr)->u.sp;
	switch (msg->b_wptr - msg->b_rptr) {
	case 1:
		sp->r_error = msg->b_rptr[0];
		sp->w_error = msg->b_rptr[0];
		break;
	case 2:
		sp->r_error = msg->b_rptr[0];
		sp->w_error = msg->b_rptr[1];
		break;
	}
	if ((err = m_link_ind(q, msg)))
		return (err);
	if ((err = ua_sp_down(q)))
		return (err);
	qdisable(q);
	return (0);
}

/*
 *  =========================================================================
 *
 *  M_HANGUP Processing
 *
 *  =========================================================================
 */
int tsp_r_hangup(queue_t * q, mblk_t * msg)
{
	int err;
	sp_t *sp = ((lp_t *) q->q_ptr)->u.sp;
	sp->r_error = 0;
	sp->w_error = 0;
	if ((err = m_link_ind(q, msg)))
		return (err);
	if ((err = ua_sp_down(q)))
		return (err);
	qdisable(q);
	return (0);
}


Home Index Prev Next More Download Info FAQ Mail   Home -> Resources -> Browse Source -> strss7/drivers/ua/ua_tsp.c

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

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