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/sua/sua_asp.h


File /code/strss7/drivers/sua/sua_asp.h



#ifndef __SUA_ASP_H__
#define __SUA_ASP_H__

#ident "@(#) $RCSfile: sua_asp.h,v $ $Name:  $($Revision: 0.8.2.1 $) $Date: 2002/10/18 02:33:28 $"

#include "../ua/ua_asp.h"	/* UA --> UA Common Messages */
#include "sua_msg.h"		/* SUA specific messages */

/*
 *  =========================================================================
 *
 *  SUA Peer Messages
 *
 *  =========================================================================
 *  These inline functions build SUA peer messages.
 */
/*
 *  UA_SNMM_DUNA
 *  ------------------------------------------------------------------------
 *  There are two versions here: N-STATE and N-PCSTATE depending on whether
 *  SSN is supplied or not.
 */
static inline mblk_t *sua_duna(uint * rcs, size_t rc_num, uint pc, uint * ssn,
			       uint smi, caddr_t inf_ptr, size_t inf_len)
{
	mblk_t *mp, *np;
	size_t rlen = rc_num ? UA_PHDR_SIZE + (rc_num << 2) : 0;
	size_t dlen = UA_PHDR_SIZE + sizeof(uint32_t) + UA_SIZE(SUA_SPARM_PC)
	    + ssn ? UA_SIZE(SUA_SPARM_SSN) : 0;
	size_t ilen = inf_ptr ? UA_PHDR_SIZE + inf_len : 0;
	size_t plen = UA_PAD4(ilen) - ilen;
	size_t mlen = UA_MHDR_SIZE + rlen + dlen + UA_PAD4(ilen);
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = UA_SNMM_DUNA;
		*((uint32_t *) mp->b_wptr)++ = htonl(mlen);
		*((uint32_t *) mp->b_wptr)++ = UA_PHDR(UA_PARM_RC, rlen);
		while (rc_num--)
			*((uint32_t *) mp->b_wptr)++ = htonl(*rcs++);
		*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_DEST_ADDR, dlen);
		*((uint16_t *) mp->b_wptr)++ = __constant_htons(SUA_RI_PC_SSN);
		*((uint16_t *) mp->b_wptr)++ = htons(SUA_AI_PC | (ssn ? SUA_AI_SSN : 0));
		*((uint32_t *) mp->b_wptr)++ = SUA_SPARM_PC;
		*((uint32_t *) mp->b_wptr)++ = htonl(pc);
		if (ssn) {
			*((uint32_t *) mp->b_wptr)++ = SUA_SPARM_SSN;
			*((uint32_t *) mp->b_wptr)++ = htonl((smi << 16) | *ssn);
		}
		if (inf_ptr) {
			*((uint32_t *) mp->b_wptr)++ = UA_PHDR(UA_PARM_INFO, ilen);
			bcopy(inf_ptr, mp->b_wptr, inf_len);
			mp->b_wptr += inf_len;
			bzero(mp->b_wptr, plen);
			mp->b_wptr += plen;
		}
		if ((np = n_exdata_req(0, N_QOS_PPI_SUA, 0, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

/*
 *  UA_SNMM_DAVA
 *  ------------------------------------------------------------------------
 *  There are two versions here: N-STATE and N-PCSTATE depending on whether
 *  SSN is supplied or not.
 */
static inline mblk_t *sua_dava(uint * rcs, size_t rc_num, uint pc, uint * ssn,
			       uint smi, caddr_t inf_ptr, size_t inf_len)
{
	mblk_t *mp, *np;
	size_t rlen = rc_num ? UA_PHDR_SIZE + (rc_num << 2) : 0;
	size_t dlen = UA_PHDR_SIZE + sizeof(uint32_t) + UA_SIZE(SUA_SPARM_PC)
	    + ssn ? UA_SIZE(SUA_SPARM_SSN) : 0;
	size_t ilen = inf_ptr ? UA_PHDR_SIZE + inf_len : 0;
	size_t plen = UA_PAD4(ilen) - ilen;
	size_t mlen = UA_MHDR_SIZE + rlen + dlen + UA_PAD4(ilen);
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = UA_SNMM_DAVA;
		*((uint32_t *) mp->b_wptr)++ = htonl(mlen);
		*((uint32_t *) mp->b_wptr)++ = UA_PHDR(UA_PARM_RC, rlen);
		while (rc_num--)
			*((uint32_t *) mp->b_wptr)++ = htonl(*rcs++);
		*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_DEST_ADDR, dlen);
		*((uint16_t *) mp->b_wptr)++ = __constant_htons(SUA_RI_PC_SSN);
		*((uint16_t *) mp->b_wptr)++ = htons(SUA_AI_PC | (ssn ? SUA_AI_SSN : 0));
		*((uint32_t *) mp->b_wptr)++ = SUA_SPARM_PC;
		*((uint32_t *) mp->b_wptr)++ = htonl(pc);
		if (ssn) {
			*((uint32_t *) mp->b_wptr)++ = SUA_SPARM_SSN;
			*((uint32_t *) mp->b_wptr)++ = htonl((smi << 16) | *ssn);
		}
		if (inf_ptr) {
			*((uint32_t *) mp->b_wptr)++ = UA_PHDR(UA_PARM_INFO, ilen);
			bcopy(inf_ptr, mp->b_wptr, inf_len);
			mp->b_wptr += inf_len;
			bzero(mp->b_wptr, plen);
			mp->b_wptr += plen;
		}
		if ((np = n_exdata_req(0, N_QOS_PPI_SUA, 0, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

/*
 *  UA_SNMM_DAUD
 *  ------------------------------------------------------------------------
 *  There are two versions here: N-STATE and N-PCSTATE depending on whether
 *  SSN is supplied or not.
 */
static inline mblk_t *sua_daud(uint * rcs, size_t rc_num, uint pc, uint * ssn,
			       uint smi, caddr_t inf_ptr, size_t inf_len)
{
	mblk_t *mp, *np;
	size_t rlen = rc_num ? UA_PHDR_SIZE + (rc_num << 2) : 0;
	size_t dlen = UA_PHDR_SIZE + sizeof(uint32_t) + UA_SIZE(SUA_SPARM_PC)
	    + ssn ? UA_SIZE(SUA_SPARM_SSN) : 0;
	size_t ilen = inf_ptr ? UA_PHDR_SIZE + inf_len : 0;
	size_t plen = UA_PAD4(ilen) - ilen;
	size_t mlen = UA_MHDR_SIZE + rlen + dlen + UA_PAD4(ilen);
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = UA_SNMM_DAUD;
		*((uint32_t *) mp->b_wptr)++ = htonl(mlen);
		*((uint32_t *) mp->b_wptr)++ = UA_PHDR(UA_PARM_RC, rlen);
		while (rc_num--)
			*((uint32_t *) mp->b_wptr)++ = htonl(*rcs++);
		*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_DEST_ADDR, dlen);
		*((uint16_t *) mp->b_wptr)++ = __constant_htons(SUA_RI_PC_SSN);
		*((uint16_t *) mp->b_wptr)++ = htons(SUA_AI_PC | (ssn ? SUA_AI_SSN : 0));
		*((uint32_t *) mp->b_wptr)++ = SUA_SPARM_PC;
		*((uint32_t *) mp->b_wptr)++ = htonl(pc);
		if (ssn) {
			*((uint32_t *) mp->b_wptr)++ = SUA_SPARM_SSN;
			*((uint32_t *) mp->b_wptr)++ = htonl((smi << 16) | *ssn);
		}
		if (inf_ptr) {
			*((uint32_t *) mp->b_wptr)++ = UA_PHDR(UA_PARM_INFO, ilen);
			bcopy(inf_ptr, mp->b_wptr, inf_len);
			mp->b_wptr += inf_len;
			bzero(mp->b_wptr, plen);
			mp->b_wptr += plen;
		}
		if ((np = n_exdata_req(0, N_QOS_PPI_SUA, 0, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

/*
 *  UA_SNMM_SCON
 *  ------------------------------------------------------------------------
 *  There are two versions here: N-STATE and N-PCSTATE depending on whether
 *  SSN is supplied or not.
 */
static inline mblk_t *sua_scon(uint * rcs, size_t rc_num, uint pc, uint * ssn,
			       uint smi, uint cong, caddr_t inf_ptr, size_t inf_len)
{
	mblk_t *mp, *np;
	size_t rlen = rc_num ? UA_PHDR_SIZE + (rc_num << 2) : 0;
	size_t dlen = UA_PHDR_SIZE + sizeof(uint32_t) + UA_SIZE(SUA_SPARM_PC)
	    + ssn ? UA_SIZE(SUA_SPARM_SSN) : 0;
	size_t ilen = inf_ptr ? UA_PHDR_SIZE + inf_len : 0;
	size_t plen = UA_PAD4(ilen) - ilen;
	size_t mlen = UA_MHDR_SIZE + rlen + dlen + UA_SIZE(UA_PARM_CONG_LEVEL)
	    + UA_PAD4(ilen);
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = UA_SNMM_SCON;
		*((uint32_t *) mp->b_wptr)++ = htonl(mlen);
		*((uint32_t *) mp->b_wptr)++ = UA_PHDR(UA_PARM_RC, rlen);
		while (rc_num--)
			*((uint32_t *) mp->b_wptr)++ = htonl(*rcs++);
		*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_DEST_ADDR, dlen);
		*((uint16_t *) mp->b_wptr)++ = __constant_htons(SUA_RI_PC_SSN);
		*((uint16_t *) mp->b_wptr)++ = htons(SUA_AI_PC | (ssn ? SUA_AI_SSN : 0));
		*((uint32_t *) mp->b_wptr)++ = SUA_SPARM_PC;
		*((uint32_t *) mp->b_wptr)++ = htonl(pc);
		if (ssn) {
			*((uint32_t *) mp->b_wptr)++ = SUA_SPARM_SSN;
			*((uint32_t *) mp->b_wptr)++ = htonl((smi << 16) | *ssn);
		}
		*((uint32_t *) mp->b_wptr)++ = UA_PARM_CONG_LEVEL;
		*((uint32_t *) mp->b_wptr)++ = htonl(cong);
		if (inf_ptr) {
			*((uint32_t *) mp->b_wptr)++ = UA_PHDR(UA_PARM_INFO, ilen);
			bcopy(inf_ptr, mp->b_wptr, inf_len);
			mp->b_wptr += inf_len;
			bzero(mp->b_wptr, plen);
			mp->b_wptr += plen;
		}
		if ((np = n_exdata_req(0, N_QOS_PPI_SUA, 0, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

/*
 *  UA_SNMM_DRST
 *  ------------------------------------------------------------------------
 *  There are two versions here: N-COORD and N-PCSTATE depending on whether
 *  SSN is supplied or not.
 *
 *  FIXME: straighten out N-COORD.
 */
static inline mblk_t *sua_drst(uint * rcs, size_t rc_num, uint pc, uint * ssn,
			       uint smi, caddr_t inf_ptr, size_t inf_len)
{
	mblk_t *mp, *np;
	size_t rlen = rc_num ? UA_PHDR_SIZE + (rc_num << 2) : 0;
	size_t dlen = UA_PHDR_SIZE + sizeof(uint32_t) + UA_SIZE(SUA_SPARM_PC)
	    + ssn ? UA_SIZE(SUA_SPARM_SSN) : 0;
	size_t ilen = inf_ptr ? UA_PHDR_SIZE + inf_len : 0;
	size_t plen = UA_PAD4(ilen) - ilen;
	size_t mlen = UA_MHDR_SIZE + rlen + dlen + UA_PAD4(ilen);
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = UA_SNMM_DRST;
		*((uint32_t *) mp->b_wptr)++ = htonl(mlen);
		*((uint32_t *) mp->b_wptr)++ = UA_PHDR(UA_PARM_RC, rlen);
		while (rc_num--)
			*((uint32_t *) mp->b_wptr)++ = htonl(*rcs++);
		*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_DEST_ADDR, dlen);
		*((uint16_t *) mp->b_wptr)++ = __constant_htons(SUA_RI_PC_SSN);
		*((uint16_t *) mp->b_wptr)++ = htons(SUA_AI_PC | (ssn ? SUA_AI_SSN : 0));
		*((uint32_t *) mp->b_wptr)++ = SUA_SPARM_PC;
		*((uint32_t *) mp->b_wptr)++ = htonl(pc);
		if (ssn) {
			*((uint32_t *) mp->b_wptr)++ = SUA_SPARM_SSN;
			*((uint32_t *) mp->b_wptr)++ = htonl((smi << 16) | *ssn);
		}
		if (inf_ptr) {
			*((uint32_t *) mp->b_wptr)++ = UA_PHDR(UA_PARM_INFO, ilen);
			bcopy(inf_ptr, mp->b_wptr, inf_len);
			mp->b_wptr += inf_len;
			bzero(mp->b_wptr, plen);
			mp->b_wptr += plen;
		}
		if ((np = n_exdata_req(0, N_QOS_PPI_SUA, 0, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

/*
 *  UA_RKMM_REG_REQ
 *  ------------------------------------------------------------------------
 */
static inline mblk_t *sua_reg_req(...)
{
}

/*
 *  UA_RKMM_REG_RSP
 *  ------------------------------------------------------------------------
 */
static inline mblk_t *sua_reg_rsp(...)
{
}

/*
 *  UA_RKMM_DEREG_REQ
 *  ------------------------------------------------------------------------
 */
static inline mblk_t *sua_dereg_req(...)
{
}

/*
 *  UA_RKMM_DEREG_RSP
 *  ------------------------------------------------------------------------
 */
static inline mblk_t *sua_dereg_rsp(...)
{
}

/*
 *  SUA_CNLS_CLDT
 *  ------------------------------------------------------------------------
 *  TODO: Need to bread out flags for SUA-08 and add a segmentation parameter.
 */
static inline mblk_t *sua_cldt(uint rc, uint flags, sccp_addr_t * src, sccp_addr_t * dst,
			       mblk_t * dp)
{
	mblk_t *mp, *np;
	const size_t slen = sua_addr_len(src);
	const size_t dlen = sua_addr_len(dst);
	const size_t mlen = UA_MHDR_SIZE + UA_SIZE(UA_PARM_RC)
	    + UA_SIZE(SUA_PARM_FLAGS)
	    + slen ? UA_PHDR_SIZE + slen : 0 + dlen ? UA_PHDR_SIZE + dlen : 0 + UA_PHDR_SIZE;
	if ((mp = allocb(mlen, BPRI_MED))) {
		const size_t blen = msgdsize(dp);
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = SUA_CNLS_CLDT;
		*((uint32_t *) mp->b_wptr)++ = htonl(mlen + blen);
		*((uint32_t *) mp->b_wptr)++ = UA_PARM_RC;
		*((uint32_t *) mp->b_wptr)++ = htonl(rc);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_FLAGS;
		*((uint32_t *) mp->b_wptr)++ = htonl(flags);
		*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_SRCE_ADDR, slen);
		sua_pack_addr(&mp->b_wptr, src);
		*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_DEST_ADDR, dlen);
		sua_pack_addr(&mp->b_wptr, dst);
		*((uint32_t *) mp->b_wptr)++ = UA_PHDR(UA_PARM_DATA, blen);
		*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_DATA, blen);
		mp->b_cont = dp;
		if ((np = n_data_req(N_RC_FLAG, N_QOS_PPI_SUA, (rc << 8) | sls, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

/*
 *  SUA_CNLS_CLDR
 *  ------------------------------------------------------------------------
 *  TODO: Need to bread out flags for SUA-08 and add a segmentation parameter.
 */
static inline mblk_t *sua_cldr(uint rc, uint flags, uint cause,
			       sccp_addr_t * src, sccp_addr_t * dst, mblk_t * dp)
{
	mblk_t *mp, *np;
	const size_t slen = sua_addr_len(src);
	const size_t dlen = sua_addr_len(dst);
	const size_t mlen = UA_MHDR_SIZE + UA_SIZE(UA_PARM_RC)
	    + UA_SIZE(SUA_PARM_CAUSE)
	    + slen ? UA_PHDR_SIZE + slen : 0 + dlen ? UA_PHDR_SIZE + dlen : 0 +
	    dp ? UA_PHDR_SIZE : 0;
	if ((mp = allocb(mlen, BPRI_MED))) {
		const size_t blen = msgdsize(dp);
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = SUA_CLNS_CLDR;
		*((uint32_t *) mp->b_wptr)++ = htonl(mlen + blen);
		*((uint32_t *) mp->b_wptr)++ = UA_PARM_RC;
		*((uint32_t *) mp->b_wptr)++ = htonl(rc);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_FLAGS;
		*((uint32_t *) mp->b_wptr)++ = htonl(flags);
		*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_SRCE_ADDR, slen);
		sua_pack_addr(&mp->b_wptr, src);
		*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_DEST_ADDR, dlen);
		sua_pack_addr(&mp->b_wptr, dst);
		*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_DATA, blen);
		if (dp)
			*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_DATA, blen);
		mp->b_cont = dp;
		if ((np = n_data_req(N_RC_FLAG, N_QOS_PPI_SUA, (rc << 8) | sls, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

/*
 *  SUA_CONS_CORE
 *  ------------------------------------------------------------------------
 *  TODO: Need to bread out flags for SUA-08 and treat protocol class 3.
 */
static inline mblk_t *sua_core(uint rc, uint flags, uint srn, sccp_addr_t * dst,
			       sccp_addr_t * src, uint * credit, mblk_t * dp)
{
	mblk_t *mp, *np;
	const size_t slen = src ? sua_addr_len(src) : 0;
	const size_t dlen = dst ? sua_addr_len(dst) : 0;
	const size_t mlen = UA_MHDR_SIZE + UA_SIZE(UA_PARM_RC)
	    + UA_SIZE(SUA_PARM_FLAGS)
	    + UA_SIZE(SUA_PARM_SRN)
	    + dlen ? UA_PHDR_SIZE + dlen : 0
	    + slen ? UA_PHDR_SIZE + slen : 0 + credit ? UA_SIZE(SUA_PARM_CREDIT) : 0 +
	    dp ? UA_PHDR_SIZE : 0;
	if ((mp = allocb(mlen, BPRI_MED))) {
		const size_t blen = dp ? msgdsize(dp) : 0;
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = SUA_CONS_CORE;
		*((uint32_t *) mp->b_wptr)++ = htonl(mlen + blen);
		*((uint32_t *) mp->b_wptr)++ = UA_PARM_RC;
		*((uint32_t *) mp->b_wptr)++ = htonl(rc);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_FLAGS;
		*((uint32_t *) mp->b_wptr)++ = htonl(flags);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_SRN;
		*((uint32_t *) mp->b_wptr)++ = htonl(srn);
		if (dst) {
			*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_DEST_ADDR, dlen);
			sua_pack_addr(&mp->b_wptr, dst);
		}
		if (src) {
			*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_SRCE_ADDR, slen);
			sua_pack_addr(&mp->b_wptr, src);
		}
		if (credit) {
			*((uint32_t *) mp->b_wptr)++ = SUA_PARM_CREDIT;
			*((uint32_t *) mp->b_wptr)++ = htonl(*credit);
		}
		if (dp)
			*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_DATA, blen);
		mp->b_cont = dp;
		if ((np = n_data_req(N_RC_FLAG, N_QOS_PPI_SUA, (rc << 8) | sls, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

/*
 *  SUA_CONS_COAK
 *  ------------------------------------------------------------------------
 */
static inline mblk_t *sua_coak(uint rc, uint flags, uint drn, uint srn,
			       uint * credit, sccp_addr_t * dst, mblk_t * dp)
{
	mblk_t *mp, *np;
	const size_t dlen = dst ? sua_addr_len(dst) : 0;
	const size_t mlen = UA_MHDR_SIZE + UA_SIZE(UA_PARM_RC)
	    + UA_SIZE(SUA_PARM_FLAGS)
	    + UA_SIZE(SUA_PARM_DRN)
	    + UA_SIZE(SUA_PARM_SRN)
	    + UA_SIZE(SUA_PARM_CREDIT)
	    + dlen ? UA_PHDR_SIZE + dlen : 0 + dp ? UA_PHDR_SIZE : 0;
	if ((mp = allocb(mlen, BPRI_MED))) {
		const size_t blen = dp ? msgdsize(dp) : 0;
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = SUA_CONS_COAK;
		*((uint32_t *) mp->b_wptr)++ = htonl(mlen + blen);
		*((uint32_t *) mp->b_wptr)++ = UA_PARM_RC;
		*((uint32_t *) mp->b_wptr)++ = htonl(rc);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_FLAGS;
		*((uint32_t *) mp->b_wptr)++ = htonl(flags);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_DRN;
		*((uint32_t *) mp->b_wptr)++ = htonl(drn);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_SRN;
		*((uint32_t *) mp->b_wptr)++ = htonl(srn);
		if (credit) {
			*((uint32_t *) mp->b_wptr)++ = SUA_PARM_CREDIT;
			*((uint32_t *) mp->b_wptr)++ = htonl(*credit);
		}
		if (dst) {
			*((uint32_t *) mp->b_wptr)++ = UA_PDHR(SUA_PARM_DEST_ADDR, dlen);
			sua_pack_addr(&mp->b_wptr, dst);
		}
		if (dp)
			*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_DATA, blen);
		mp->b_cont = dp;
		if ((np = n_data_req(N_RC_FLAG, N_QOS_PPI_SUA, (rc << 8) | sls, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

/*
 *  SUA_CONS_COREF
 *  ------------------------------------------------------------------------
 */
static inline mblk_t *sua_coref(uint rc, uint drn, uint cause, sccp_addr_t * dst, mblk_t * dp)
{
	mblk_t *mp, *np;
	const size_t dlen = dst ? sua_addr_len(dst) : 0;
	const size_t mlen = UA_MHDR_SIZE + UA_SIZE(UA_PARM_RC)
	    + UA_SIZE(SUA_PARM_DRN)
	    + UA_SIZE(SUA_PARM_CAUSE)
	    + dlen ? UA_PHDR_SIZE + dlen : 0 + dp ? UA_PDHR_SIZE : 0;
	if ((mp = allocb(mlen, BPRI_MED))) {
		const size_t blen = dp ? msgdsize(dp) : 0;
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = SUA_CONS_COREF;
		*((uint32_t *) mp->b_wptr)++ = htonl(mlen + blen);
		*((uint32_t *) mp->b_wptr)++ = UA_PARM_RC;
		*((uint32_t *) mp->b_wptr)++ = htonl(rc);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_DRN;
		*((uint32_t *) mp->b_wptr)++ = htonl(drn);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_CAUSE;
		*((uint32_t *) mp->b_wptr)++ = htonl(cause);
		if (dst) {
			*((uint32_t *) mp->b_wptr)++ = UA_PDHR(SUA_PARM_DEST_ADDR, dlen);
			sua_pack_addr(&mp->b_wptr, dst);
		}
		if (dp)
			*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_DATA, blen);
		mp->b_cont = dp;
		if ((np = n_data_req(N_RC_FLAG, N_QOS_PPI_SUA, (rc << 8) | sls, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

/*
 *  SUA_CONS_RELRE
 *  ------------------------------------------------------------------------
 */
static inline mblk_t *sua_relre(uint rc, uint drn, uint srn, uint cause, uint flags, mblk_t * dp)
{
	mblk_t *mp, *np;
	const size_t mlen = UA_MHDR_SIZE + UA_SIZE(UA_PARM_RC)
	    + UA_SIZE(SUA_PARM_DRN)
	    + UA_SIZE(SUA_PARM_SRN)
	    + UA_SIZE(SUA_PARM_CAUSE)
	    + UA_SIZE(SUA_PARM_FLAGS)
	    + dp ? UA_PHDR_SIZE : 0;
	if ((mp = allocb(mlen, BPRI_MED))) {
		const size_t blen = dp ? msgdsize(dp) : 0;
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = SUA_CONS_RELRE;
		*((uint32_t *) mp->b_wptr)++ = htonl(mlen + blen);
		*((uint32_t *) mp->b_wptr)++ = UA_PARM_RC;
		*((uint32_t *) mp->b_wptr)++ = htonl(rc);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_DRN;
		*((uint32_t *) mp->b_wptr)++ = htonl(drn);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_SRN;
		*((uint32_t *) mp->b_wptr)++ = htonl(srn);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_CAUSE;
		*((uint32_t *) mp->b_wptr)++ = htonl(cause);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_FLAGS;
		*((uint32_t *) mp->b_wptr)++ = htonl(flags);
		if (dp)
			*((uint32_t *) mp->b_wptr)++ = UA_PHDR(SUA_PARM_DATA, blen);
		mp->b_cont = dp;
		if ((np = n_data_req(N_RC_FLAG, N_QOS_PPI_SUA, (rc << 8) | sls, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

/*
 *  SUA_CONS_RELCO
 *  ------------------------------------------------------------------------
 */
static inline mblk_t *sua_relco(uint rc, uint drn, uint srn)
{
	mblk_t *mp, *np;
	static const size_t mlen = UA_MHDR_SIZE + UA_SIZE(UA_PARM_RC)
	    + UA_SIZE(SUA_PARM_DRN)
	    + UA_SIZE(SUA_PARM_SRN);
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = SUA_CONS_RELCO;
		*((uint32_t *) mp->b_wptr)++ = __constant_htonl(mlen);
		*((uint32_t *) mp->b_wptr)++ = UA_PARM_RC;
		*((uint32_t *) mp->b_wptr)++ = htonl(rc);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_DRN;
		*((uint32_t *) mp->b_wptr)++ = htonl(drn);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_SRN;
		*((uint32_t *) mp->b_wptr)++ = htonl(srn);
		if ((np = n_data_req(N_RC_FLAG, N_QOS_PPI_SUA, (rc << 8) | sls, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

/*
 *  SUA_CONS_RESCO
 *  ------------------------------------------------------------------------
 */
static inline mblk_t *sua_resco(uint rc, uint drn, uint srn)
{
	mblk_t *mp, *np;
	static const size_t mlen = UA_MHDR_SIZE + UA_SIZE(UA_PARM_RC)
	    + UA_SIZE(SUA_PARM_DRN)
	    + UA_SIZE(SUA_PARM_SRN);
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = SUA_CONS_RESCO;
		*((uint32_t *) mp->b_wptr)++ = __constant_htonl(mlen);
		*((uint32_t *) mp->b_wptr)++ = UA_PARM_RC;
		*((uint32_t *) mp->b_wptr)++ = htonl(rc);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_DRN;
		*((uint32_t *) mp->b_wptr)++ = htonl(drn);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_SRN;
		*((uint32_t *) mp->b_wptr)++ = htonl(srn);
		if ((np = n_data_req(N_RC_FLAG, N_QOS_PPI_SUA, (rc << 8) | sls, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

/*
 *  SUA_CONS_RESRE
 *  ------------------------------------------------------------------------
 */
static inline mblk_t *sua_relre(uint rc, uint drn, uint srn, uint cause)
{
	mblk_t *mp, *np;
	static const size_t mlen = UA_MHDR_SIZE + UA_SIZE(UA_PARM_RC)
	    + UA_SIZE(SUA_PARM_DRN)
	    + UA_SIZE(SUA_PARM_SRN)
	    + UA_SIZE(SUA_PARM_CAUSE);
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = SUA_CONS_RELRE;
		*((uint32_t *) mp->b_wptr)++ = __constant_htonl(mlen);
		*((uint32_t *) mp->b_wptr)++ = UA_PARM_RC;
		*((uint32_t *) mp->b_wptr)++ = htonl(rc);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_DRN;
		*((uint32_t *) mp->b_wptr)++ = htonl(drn);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_SRN;
		*((uint32_t *) mp->b_wptr)++ = htonl(srn);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_CAUSE;
		*((uint32_t *) mp->b_wptr)++ = htonl(cause);
		if ((np = n_data_req(N_RC_FLAG, N_QOS_PPI_SUA, (rc << 8) | sls, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

/*
 *  SUA_CONS_CODT
 *  ------------------------------------------------------------------------
 */
static inline mblk_t *sua_codt(uint rc, uint seq, uint drn, mblk_t * dp)
{
	mblk_t *mp, *np;
	static const size_t mlen = UA_MHDR_SIZE + UA_SIZE(UA_PARM_RC)
	    + UA_SIZE(SUA_PARM_SEQ)
	    + UA_SIZE(SUA_PARM_DRN)
	    + UA_PHDR_SIZE;
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = SUA_CONS_CODT;
		*((uint32_t *) mp->b_wptr)++ = __constant_htonl(mlen);
		*((uint32_t *) mp->b_wptr)++ = UA_PARM_RC;
		*((uint32_t *) mp->b_wptr)++ = htonl(rc);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_SEQ;
		*((uint32_t *) mp->b_wptr)++ = htonl(seq);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_DRN;
		*((uint32_t *) mp->b_wptr)++ = htonl(drn);
		*((uint32_t *) mp->b_wptr)++ = UA_PARM(SUA_PARM_DATA, msgdsize(dp));
		mp->b_cont = dp;
		if ((np = n_data_req(N_RC_FLAG, N_QOS_PPI_SUA, (rc << 8) | sls, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

/*
 *  SUA_CONS_CODA
 *  ------------------------------------------------------------------------
 */
static inline mblk_t *sua_coda(uint rc, uint drn, uint * seq, uint * credit)
{
	mblk_t *mp, *np;
	const size_t mlen = UA_MHDR_SIZE + UA_SIZE(UA_PARM_RC)
	    + UA_SIZE(SUA_PARM_DRN)
	    + seq ? UA_SIZE(SUA_PARM_SEQ) : 0 + credit ? UA_SIZE(SUA_PARM_CREDIT) : 0;
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = SUA_CONS_CODA;
		*((uint32_t *) mp->b_wptr)++ = htonl(mlen);
		*((uint32_t *) mp->b_wptr)++ = UA_PARM_RC;
		*((uint32_t *) mp->b_wptr)++ = htonl(rc);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_DRN;
		*((uint32_t *) mp->b_wptr)++ = htonl(drn);
		if (seq) {
			*((uint32_t *) mp->b_wptr)++ = SUA_PARM_SEQ;
			*((uint32_t *) mp->b_wptr)++ = htonl(*seq);
		}
		if (credit) {
			*((uint32_t *) mp->b_wptr)++ = SUA_PARM_CREDIT;
			*((uint32_t *) mp->b_wptr)++ = htonl(*credit);
		}
		if ((np = n_data_req(N_RC_FLAG, N_QOS_PPI_SUA, (rc << 8) | sls, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

/*
 *  SUA_CONS_COERR
 *  ------------------------------------------------------------------------
 */
static inline mblk_t *sua_coerr(uint rc, uint drn, uint cause)
{
	mblk_t *mp, *np;
	static const size_t mlen = UA_MHDR_SIZE + UA_SIZE(UA_PARM_RC)
	    + UA_SIZE(SUA_PARM_DRN)
	    + UA_SIZE(SUA_PARM_CAUSE);
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = SUA_CONS_COERR;
		*((uint32_t *) mp->b_wptr)++ = __constant_htonl(mlen);
		*((uint32_t *) mp->b_wptr)++ = UA_PARM_RC;
		*((uint32_t *) mp->b_wptr)++ = htonl(rc);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_DRN;
		*((uint32_t *) mp->b_wptr)++ = htonl(drn);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_CAUSE;
		*((uint32_t *) mp->b_wptr)++ = htonl(cause);
		if ((np = n_data_req(N_RC_FLAG, N_QOS_PPI_SUA, (rc << 8) | sls, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

/*
 *  SUA_CONS_COIT
 *  ------------------------------------------------------------------------
 */
static inline mblk_t *sua_coit(uint rc, uint flags, uint srn, uint drn, uint seq, uint credit)
{
	mblk_t *mp, *np;
	static const size_t mlen = UA_MHDR_SIZE + UA_SIZE(UA_PARM_RC)
	    + UA_SIZE(SUA_PARM_FLAGS)
	    + UA_SIZE(SUA_PARM_SRN)
	    + UA_SIZE(SUA_PARM_DRN)
	    + UA_SIZE(SUA_PARM_SEQ)
	    + UA_SIZE(SUA_PARM_CREDIT);
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		*((uint32_t *) mp->b_wptr)++ = SUA_CONS_COIT;
		*((uint32_t *) mp->b_wptr)++ = __constant_htonl(mlen);
		*((uint32_t *) mp->b_wptr)++ = UA_PARM_RC;
		*((uint32_t *) mp->b_wptr)++ = htonl(rc);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_SRN;
		*((uint32_t *) mp->b_wptr)++ = htonl(srn);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_DRN;
		*((uint32_t *) mp->b_wptr)++ = htonl(drn);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_SEQ;
		*((uint32_t *) mp->b_wptr)++ = htonl(seq);
		*((uint32_t *) mp->b_wptr)++ = SUA_PARM_CREDIT;
		*((uint32_t *) mp->b_wptr)++ = htonl(credit);
		if ((np = n_data_req(N_RC_FLAG, N_QOS_PPI_SUA, (rc << 8) | sls, mp)))
			return (np);
		freeb(mp);
	}
	return (NULL);
}

#endif				/* __SUA_ASP_H__ */


Home Index Prev Next More Download Info FAQ Mail   Home -> Resources -> Browse Source -> strss7/drivers/sua/sua_asp.h

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

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