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/tcap/tcap_pdu.h


File /code/strss7/drivers/tcap/tcap_pdu.h



#ifndef __TCAP_PDU_H__
#define __TCAP_PDU_H__

#ident "@(#) $RCSfile: tcap_pdu.h,v $ $Name:  $($Revision: 0.8.2.1 $) $Date: 2002/10/18 02:29:53 $"

/*
 *  =========================================================================
 *
 *  TCAP SEND Peer Messages
 *
 *  =========================================================================
 *
 *  ANSI TCAP Message (Transaction (TR) Sub-Layer) encoding.
 *
 *  -------------------------------------------------------------------------
 *
 *  ANSI UNI (Unidirectional)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_priv_enc_uni(mblk_t * dp, mblk_t * cp)
{
	mblk_t *mp, *mc;
	size_t pkg_len, dlg_len, cmp_len, mlen, hlen plen, dlen, clen;
	/* 
	 *  TODO: reduce these to constants where possible
	 */
	dlg_len = dp ? msgdsize(dp) : 0;
	cmp_len = cp ? msgdsize(cp) : 0;
	ilen = tag_size(TCAP_TAG_PRIV_TRSID) + len_size(0);
	dlen = dlg_len ? (tag_size(TCAP_TAG_PRIV_DLGP) + len_size(dlg_len)) : 0;
	clen = cmp_len ? (tag_size(TCAP_TAG_PRIV_CSEQ) + len_size(cmp_len)) : 0;
	pkg_len = ilen + dlen + dlg_len + clen + cmp_len;
	hlen = tag_size(TCAP_TAG_PRIV_UNI) + len_size(pkg_len)
	    mlen = hlen + ilen + dlen ? dlen : clen;
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_UNI);
		pack_len(&mp->b_wptr, pkg_len);
		pack_tag_priv_prim(&mp->b_wptr, TCAP_TAG_PRIV_TRSID);
		pack_len(&mp->b_wptr, 0);
		if (clen && !dlen) {	/* common case */
			pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_CSEQ);
			pack_len(&mp->b_wptr, cmp_len);
			linkb(mp, cp);
			return (mp);
		}
		if (dlen) {	/* oddball case */
			pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_DLGP);
			pack_len(&mp->b_wptr, dlg_len);
			linkb(mp, dp);
		}
		if (clen) {	/* even odder case */
			if ((mc = allocb(clen, BPRI_MED))) {
				mc->b_datap->db_type = M_DATA;
				pack_tag_priv_cons(&mc->b_wptr, TCAP_TAG_PRIV_CSEQ);
				pack_len(&mc->b_wptr, cmp_len);
				linkb(mp, mc);
				linkb(mp, cp);
				return (mp);
			}
			freeb(mp);
			return (NULL);
		}
	}
	return (mp);
}

/*
 *  ANSI QWP (Query with permission)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_priv_enc_qwp(uint32_t origid, mblk_t * dp, mblk_t * cp)
{
	mblk_t *mp, *mc;
	size_t pkg_len, dlg_len, cmp_len, mlen, hlen, ilen, plen, dlen, clen;
	/* 
	 *  TODO: reduce these to constants where possible
	 */
	dlg_len = dp ? msgdsize(dp) : 0;
	cmp_len = cp ? msgdsize(cp) : 0;
	ilen = tag_size(TCAP_TAG_PRIV_TRSID) + len_size(sizeof(origid));
	dlen = dlg_len ? (tag_size(TCAP_TAG_PRIV_DLGP) + len_size(dlg_len)) : 0;
	clen = cmp_len ? (tag_size(TCAP_TAG_PRIV_CSEQ) + len_size(cmp_len)) : 0;
	pkg_len = ilen + sizeof(origid) + dlen + dlg_len + clen + cmp_len;
	hlen = tag_size(TCAP_TAG_PRIV_QWP) + len_size(pkg_len)
	    mlen = hlen + ilen + dlen ? dlen : clen;
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_QWP);
		pack_len(&mp->b_wptr, pkg_len);
		pack_tag_priv_prim(&mp->b_wptr, TCAP_TAG_PRIV_TRSID);
		pack_len(&mp->b_wptr, sizeof(origid));
		pack_int(*mp->b_wptr, origid, sizeof(origid));
		if (clen && !dlen) {	/* common case */
			pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_CSEQ);
			pack_len(&mp->b_wptr, cmp_len);
			linkb(mp, cp);
			return (mp);
		}
		if (dlen) {	/* oddball case */
			pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_DLGP);
			pack_len(&mp->b_wptr, dlg_len);
			linkb(mp, dp);
		}
		if (clen) {	/* even odder case */
			if ((mc = allocb(clen, BPRI_MED))) {
				mc->b_datap->db_type = M_DATA;
				pack_tag_priv_cons(&mc->b_wptr, TCAP_TAG_PRIV_CSEQ);
				pack_len(&mc->b_wptr, cmp_len);
				linkb(mp, mc);
				linkb(mp, cp);
				return (mp);
			}
			freeb(mp);
			return (NULL);
		}
	}
	return (mp);
}

/*
 *  ANSI QWOP (Query without permission)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_priv_enc_qwop(uint32_t origid, mblk_t * dp, mblk_t * cp)
{
	mblk_t *mp, *mc;
	size_t pkg_len, dlg_len, cmp_len, mlen, hlen, ilen, plen, dlen, clen;
	/* 
	 *  TODO: reduce these to constants where possible
	 */
	dlg_len = dp ? msgdsize(dp) : 0;
	cmp_len = cp ? msgdsize(cp) : 0;
	ilen = tag_size(TCAP_TAG_PRIV_TRSID) + len_size(sizeof(origid));
	dlen = dlg_len ? (tag_size(TCAP_TAG_PRIV_DLGP) + len_size(dlg_len)) : 0;
	clen = cmp_len ? (tag_size(TCAP_TAG_PRIV_CSEQ) + len_size(cmp_len)) : 0;
	pkg_len = ilen + sizeof(origid) + dlen + dlg_len + clen + cmp_len;
	hlen = tag_size(TCAP_TAG_PRIV_QWOP) + len_size(pkg_len)
	    mlen = hlen + ilen + dlen ? dlen : clen;
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_QWOP);
		pack_len(&mp->b_wptr, pkg_len);
		pack_tag_priv_prim(&mp->b_wptr, TCAP_TAG_PRIV_TRSID);
		pack_len(&mp->b_wptr, sizeof(origid));
		pack_int(*mp->b_wptr, origid, sizeof(origid));
		if (clen && !dlen) {	/* common case */
			pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_CSEQ);
			pack_len(&mp->b_wptr, cmp_len);
			linkb(mp, cp);
			return (mp);
		}
		if (dlen) {	/* oddball case */
			pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_DLGP);
			pack_len(&mp->b_wptr, dlg_len);
			linkb(mp, dp);
		}
		if (clen) {	/* even odder case */
			if ((mc = allocb(clen, BPRI_MED))) {
				mc->b_datap->db_type = M_DATA;
				pack_tag_priv_cons(&mc->b_wptr, TCAP_TAG_PRIV_CSEQ);
				pack_len(&mc->b_wptr, cmp_len);
				linkb(mp, mc);
				linkb(mp, cp);
				return (mp);
			}
			freeb(mp);
			return (NULL);
		}
	}
	return (mp);
}

/*
 *  ANSI RESP (Response)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_priv_enc_resp(uint32_t destid, mblk_t * dp, mblk_t * cp)
{
	mblk_t *mp, *mc;
	size_t pkg_len, dlg_len, cmp_len, mlen, hlen, ilen, plen, dlen, clen;
	/* 
	 *  TODO: reduce these to constants where possible
	 */
	dlg_len = dp ? msgdsize(dp) : 0;
	cmp_len = cp ? msgdsize(cp) : 0;
	ilen = tag_size(TCAP_TAG_PRIV_TRSID) + len_size(sizeof(destid));
	dlen = dlg_len ? (tag_size(TCAP_TAG_PRIV_DLGP) + len_size(dlg_len)) : 0;
	clen = cmp_len ? (tag_size(TCAP_TAG_PRIV_CSEQ) + len_size(cmp_len)) : 0;
	pkg_len = ilen + sizeof(destid) + dlen + dlg_len + clen + cmp_len;
	hlen = tag_size(TCAP_TAG_PRIV_RESP) + len_size(pkg_len)
	    mlen = hlen + ilen + dlen ? dlen : clen;
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_RESP);
		pack_len(&mp->b_wptr, pkg_len);
		pack_tag_priv_prim(&mp->b_wptr, TCAP_TAG_PRIV_TRSID);
		pack_len(&mp->b_wptr, sizeof(destid));
		pack_int(*mp->b_wptr, destid, sizeof(destid));
		if (clen && !dlen) {	/* common case */
			pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_CSEQ);
			pack_len(&mp->b_wptr, cmp_len);
			linkb(mp, cp);
			return (mp);
		}
		if (dlen) {	/* oddball case */
			pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_DLGP);
			pack_len(&mp->b_wptr, dlg_len);
			linkb(mp, dp);
		}
		if (clen) {	/* even odder case */
			if ((mc = allocb(clen, BPRI_MED))) {
				mc->b_datap->db_type = M_DATA;
				pack_tag_priv_cons(&mc->b_wptr, TCAP_TAG_PRIV_CSEQ);
				pack_len(&mc->b_wptr, cmp_len);
				linkb(mp, mc);
				linkb(mp, cp);
				return (mp);
			}
			freeb(mp);
			return (NULL);
		}
	}
	return (mp);
}

/*
 *  ANSI CWP (Conversation with permission)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_priv_enc_cwp(uint32_t origid, uint32_t destid, mblk_t * dp, mblk_t * cp)
{
	mblk_t *mp, *mc;
	size_t pkg_len, dlg_len, cmp_len, mlen, hlen, ilen, plen, dlen, clen;
	/* 
	 *  TODO: reduce these to constants where possible
	 */
	dlg_len = dp ? msgdsize(dp) : 0;
	cmp_len = cp ? msgdsize(cp) : 0;
	ilen = tag_size(TCAP_TAG_PRIV_TRSID) + len_size(sizeof(origid) + sizeof(destid));
	dlen = dlg_len ? (tag_size(TCAP_TAG_PRIV_DLGP) + len_size(dlg_len)) : 0;
	clen = cmp_len ? (tag_size(TCAP_TAG_PRIV_CSEQ) + len_size(cmp_len)) : 0;
	pkg_len = ilen + sizeof(origid) + sizeof(destid) + dlen + dlg_len + clen + cmp_len;
	hlen = tag_size(TCAP_TAG_PRIV_CWP) + len_size(pkg_len)
	    mlen = hlen + ilen + dlen ? dlen : clen;
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_CWP);
		pack_len(&mp->b_wptr, pkg_len);
		pack_tag_priv_prim(&mp->b_wptr, TCAP_TAG_PRIV_TRSID);
		pack_len(&mp->b_wptr, sizeof(origid) + sizeof(destid));
		pack_int(*mp->b_wptr, origid, sizeof(origid));
		pack_int(*mp->b_wptr, destid, sizeof(destid));
		if (clen && !dlen) {	/* common case */
			pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_CSEQ);
			pack_len(&mp->b_wptr, cmp_len);
			linkb(mp, cp);
			return (mp);
		}
		if (dlen) {	/* oddball case */
			pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_DLGP);
			pack_len(&mp->b_wptr, dlg_len);
			linkb(mp, dp);
		}
		if (clen) {	/* even odder case */
			if ((mc = allocb(clen, BPRI_MED))) {
				mc->b_datap->db_type = M_DATA;
				pack_tag_priv_cons(&mc->b_wptr, TCAP_TAG_PRIV_CSEQ);
				pack_len(&mc->b_wptr, cmp_len);
				linkb(mp, mc);
				linkb(mp, cp);
				return (mp);
			}
			freeb(mp);
			return (NULL);
		}
	}
	return (mp);
}

/*
 *  ANSI CWOP (Conversation without permission)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_priv_enc_cwop(uint32_t origid, uint32_t destid, mblk_t * dp, mblk_t * cp)
{
	mblk_t *mp, *mc;
	size_t pkg_len, dlg_len, cmp_len, mlen, hlen, ilen, plen, dlen, clen;
	/* 
	 *  TODO: reduce these to constants where possible
	 */
	dlg_len = dp ? msgdsize(dp) : 0;
	cmp_len = cp ? msgdsize(cp) : 0;
	ilen = tag_size(TCAP_TAG_PRIV_TRSID) + len_size(sizeof(origid) + sizeof(destid));
	dlen = dlg_len ? (tag_size(TCAP_TAG_PRIV_DLGP) + len_size(dlg_len)) : 0;
	clen = cmp_len ? (tag_size(TCAP_TAG_PRIV_CSEQ) + len_size(cmp_len)) : 0;
	pkg_len = ilen + sizeof(origid) + sizeof(destid) + dlen + dlg_len + clen + cmp_len;
	hlen = tag_size(TCAP_TAG_PRIV_CWOP) + len_size(pkg_len)
	    mlen = hlen + ilen + dlen ? dlen : clen;
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_CWOP);
		pack_len(&mp->b_wptr, pkg_len);
		pack_tag_priv_prim(&mp->b_wptr, TCAP_TAG_PRIV_TRSID);
		pack_len(&mp->b_wptr, sizeof(origid) + sizeof(destid));
		pack_int(*mp->b_wptr, origid, sizeof(origid));
		pack_int(*mp->b_wptr, destid, sizeof(destid));
		if (clen && !dlen) {	/* common case */
			pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_CSEQ);
			pack_len(&mp->b_wptr, cmp_len);
			linkb(mp, cp);
			return (mp);
		}
		if (dlen) {	/* oddball case */
			pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_DLGP);
			pack_len(&mp->b_wptr, dlg_len);
			linkb(mp, dp);
		}
		if (clen) {	/* even odder case */
			if ((mc = allocb(clen, BPRI_MED))) {
				mc->b_datap->db_type = M_DATA;
				pack_tag_priv_cons(&mc->b_wptr, TCAP_TAG_PRIV_CSEQ);
				pack_len(&mc->b_wptr, cmp_len);
				linkb(mp, mc);
				linkb(mp, cp);
				return (mp);
			}
			freeb(mp);
			return (NULL);
		}
	}
	return (mp);
}

/*
 *  ANSI ABORT (Abort)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_priv_enc_abt(uint32_t destid, mblk_t * dp, mblk_t * ep)
{
	mblk_t *mp, *mc;
	size_t pkg_len, dlg_len, cmp_len, mlen, hlen, ilen, plen, dlen, clen;
	/* 
	 *  TODO: reduce these to constants where possible
	 */
	dlg_len = dp ? msgdsize(dp) : 0;
	cmp_len = cp ? msgdsize(cp) : 0;
	ilen = tag_size(TCAP_TAG_PRIV_TRSID) + len_size(sizeof(destid));
	dlen = dlg_len ? (tag_size(TCAP_TAG_PRIV_DLGP) + len_size(dlg_len)) : 0;
	clen = cmp_len ? (tag_size(TCAP_TAG_PRIV_CSEQ) + len_size(cmp_len)) : 0;
	pkg_len = ilen + sizeof(destid) + dlen + dlg_len + clen + cmp_len;
	hlen = tag_size(TCAP_TAG_PRIV_ABORT) + len_size(pkg_len)
	    mlen = hlen + ilen + dlen ? dlen : clen;
	if ((mp = allocb(mlen, BPRI_MED))) {
		/* 
		 *  FIXME for cause information rather than components
		 */
		mp->b_datap->db_type = M_DATA;
		pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_ABORT);
		pack_len(&mp->b_wptr, pkg_len);
		pack_tag_priv_prim(&mp->b_wptr, TCAP_TAG_PRIV_TRSID);
		pack_len(&mp->b_wptr, sizeof(destid));
		pack_int(*mp->b_wptr, destid, sizeof(destid));
		if (clen && !dlen) {	/* common case */
			pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_CSEQ);
			pack_len(&mp->b_wptr, cmp_len);
			linkb(mp, cp);
			return (mp);
		}
		if (dlen) {	/* oddball case */
			pack_tag_priv_cons(&mp->b_wptr, TCAP_TAG_PRIV_DLGP);
			pack_len(&mp->b_wptr, dlg_len);
			linkb(mp, dp);
		}
		if (clen) {	/* even odder case */
			if ((mc = allocb(clen, BPRI_MED))) {
				mc->b_datap->db_type = M_DATA;
				pack_tag_priv_cons(&mc->b_wptr, TCAP_TAG_PRIV_CSEQ);
				pack_len(&mc->b_wptr, cmp_len);
				linkb(mp, mc);
				linkb(mp, cp);
				return (mp);
			}
			freeb(mp);
			return (NULL);
		}
	}
	return (mp);
}

/*
 *  -------------------------------------------------------------------------
 *
 *  ITUT TCAP Message (Transaction (TR) Sub-Layer) encoding.
 *
 *  -------------------------------------------------------------------------
 *
 *  ITUT UNI (Unidirectional)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_appl_enc_uni(mblk_t * dp, mblk_t * cp)
{
	mblk_t *mp, *mc;
	size_t pkg_len, dlg_len, cmp_len, mlen, hlen, ilen, plen, dlen, clen;
	/* 
	 *  TODO: reduce these to constants where possible
	 */
	dlg_len = dp ? msgdsize(dp) : 0;
	cmp_len = cp ? msgdsize(cp) : 0;
	ilen = 0;
	dlen = dlg_len ? (tag_size(TCAP_TAG_APPL_DLGP) + len_size(dlg_len)) : 0;
	clen = cmp_len ? (tag_size(TCAP_TAG_PAPPLCSEQ) + len_size(cmp_len)) : 0;
	pkg_len = ilen + sizeof(origid) + dlen + dlg_len + clen + cmp_len;
	hlen = tag_size(TCAP_TAG_APPL_UNI) + len_size(pkg_len)
	    mlen = hlen + ilen + dlen ? dlen : clen;
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		pack_tag_appl_cons(&mp->b_wptr, TCAP_TAG_APPL_UNI);
		pack_len(&mp->b_wptr, pkg_len);
		if (clen && !dlen) {	/* common case, components no dialog */
			pack_tag_appl_cons(&mp->b_wptr, TCAP_TAG_APPL_CSEQ);
			pack_len(&mp->b_wptr, cmp_len);
			linkb(mp, cp);
			return (mp);
		}
		if (dlen) {	/* oddball case, dialog */
			pack_tag_appl_cons(&mp->b_wptr, TCAP_TAG_APPL_DLGP);
			pack_len(&mp->b_wptr, dlg_len);
			linkb(mp, dp);
		}
		if (clen) {	/* oddbal case, dialog and components */
			if ((mc = allocb(clen, BPRI_MED))) {
				mc->b_datap->db_type = M_DATA;
				pack_tag_appl_cons(&mc->b_wptr, TCAP_TAG_APPL_CSEQ);
				pack_len(&mc->b_wptr, cmp_len);
				linkb(mp, mc);
				linkb(mp, cp);
				return (mp);
			}
			freeb(mp);
			return (NULL);
		}
	}
	return (mp);
}

/*
 *  ITUT BEG (Begin)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_appl_enc_beg(uint32_t origid, mblk_t * dp, mblk_t * cp)
{
	mblk_t *mp, *mc;
	size_t pkg_len, dlg_len, cmp_len, mlen, hlen, ilen, plen, dlen, clen;
	/* 
	 *  TODO: reduce these to constants where possible
	 */
	dlg_len = dp ? msgdsize(dp) : 0;
	cmp_len = cp ? msgdsize(cp) : 0;
	ilen = tag_size(TCAP_TAG_APPL_ORIGID) + len_size(sizeof(origid));
	dlen = dlg_len ? (tag_size(TCAP_TAG_APPL_DLGP) + len_size(dlg_len)) : 0;
	clen = cmp_len ? (tag_size(TCAP_TAG_PAPPLCSEQ) + len_size(cmp_len)) : 0;
	pkg_len = ilen + sizeof(origid) + dlen + dlg_len + clen + cmp_len;
	hlen = tag_size(TCAP_TAG_APPL_BEGIN) + len_size(pkg_len)
	    mlen = hlen + ilen + dlen ? dlen : clen;
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		pack_tag_appl_cons(&mp->b_wptr, TCAP_TAG_APPL_BEGIN);
		pack_len(&mp->b_wptr, pkg_len);
		pack_tag_appl_prim(&mp->b_wptr, TCAP_TAG_APPL_ORIGID);
		pack_len(&mp->b_wptr, sizeof(origid));
		pack_int(&mp->b_wptr, origid, sizeof(origid));
		if (clen && !dlen) {	/* common case, components no dialog */
			pack_tag_appl_cons(&mp->b_wptr, TCAP_TAG_APPL_CSEQ);
			pack_len(&mp->b_wptr, cmp_len);
			linkb(mp, cp);
			return (mp);
		}
		if (dlen) {	/* oddball case, dialog */
			pack_tag_appl_cons(&mp->b_wptr, TCAP_TAG_APPL_DLGP);
			pack_len(&mp->b_wptr, dlg_len);
			linkb(mp, dp);
		}
		if (clen) {	/* oddbal case, dialog and components */
			if ((mc = allocb(clen, BPRI_MED))) {
				mc->b_datap->db_type = M_DATA;
				pack_tag_appl_cons(&mc->b_wptr, TCAP_TAG_APPL_CSEQ);
				pack_len(&mc->b_wptr, cmp_len);
				linkb(mp, mc);
				linkb(mp, cp);
				return (mp);
			}
			freeb(mp);
			return (NULL);
		}
	}
	return (mp);
}

/*
 *  ITUT END (End)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_appl_enc_end(uint32_t destid, mblk_t * dp, mblk_t * cp)
{
	mblk_t *mp, *mc;
	size_t pkg_len, dlg_len, cmp_len, mlen, hlen, ilen, plen, dlen, clen;
	/* 
	 *  TODO: reduce these to constants where possible
	 */
	dlg_len = dp ? msgdsize(dp) : 0;
	cmp_len = cp ? msgdsize(cp) : 0;
	ilen = tag_size(TCAP_TAG_APPL_DESTID) + len_size(sizeof(destid));
	dlen = dlg_len ? (tag_size(TCAP_TAG_APPL_DLGP) + len_size(dlg_len)) : 0;
	clen = cmp_len ? (tag_size(TCAP_TAG_PAPPLCSEQ) + len_size(cmp_len)) : 0;
	pkg_len = ilen + sizeof(destid) + dlen + dlg_len + clen + cmp_len;
	hlen = tag_size(TCAP_TAG_APPL_END) + len_size(pkg_len)
	    mlen = hlen + ilen + dlen ? dlen : clen;
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		pack_tag_appl_cons(&mp->b_wptr, TCAP_TAG_APPL_END);
		pack_len(&mp->b_wptr, pkg_len);
		pack_tag_appl_prim(&mp->b_wptr, TCAP_TAG_APPL_DESTID);
		pack_len(&mp->b_wptr, sizeof(destid));
		pack_int(&mp->b_wptr, destid, sizeof(destid));
		if (clen && !dlen) {	/* common case, components no dialog */
			pack_tag_appl_cons(&mp->b_wptr, TCAP_TAG_APPL_CSEQ);
			pack_len(&mp->b_wptr, cmp_len);
			linkb(mp, cp);
			return (mp);
		}
		if (dlen) {	/* oddball case, dialog */
			pack_tag_appl_cons(&mp->b_wptr, TCAP_TAG_APPL_DLGP);
			pack_len(&mp->b_wptr, dlg_len);
			linkb(mp, dp);
		}
		if (clen) {	/* oddbal case, dialog and components */
			if ((mc = allocb(clen, BPRI_MED))) {
				mc->b_datap->db_type = M_DATA;
				pack_tag_appl_cons(&mc->b_wptr, TCAP_TAG_APPL_CSEQ);
				pack_len(&mc->b_wptr, cmp_len);
				linkb(mp, mc);
				linkb(mp, cp);
				return (mp);
			}
			freeb(mp);
			return (NULL);
		}
	}
	return (mp);
}

/*
 *  ITUT CONT (Continue)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_appl_enc_cont(uint32_t origid, uint destid, mblk_t * dp, mblk_t * cp)
{
	mblk_t *mp, *mc;
	size_t pkg_len, dlg_len, cmp_len, mlen, hlen, ilen, plen, dlen, clen;
	/* 
	 *  TODO: reduce these to constants where possible
	 */
	dlg_len = dp ? msgdsize(dp) : 0;
	cmp_len = cp ? msgdsize(cp) : 0;
	ilen = tag_size(TCAP_TAG_APPL_ORIGID) + len_size(sizeof(origid)) +
	    tag_size(TCAP_TAG_APPL_DESTID) + len_size(sizeof(destid));
	dlen = dlg_len ? (tag_size(TCAP_TAG_APPL_DLGP) + len_size(dlg_len)) : 0;
	clen = cmp_len ? (tag_size(TCAP_TAG_PAPPLCSEQ) + len_size(cmp_len)) : 0;
	pkg_len = ilen + sizeof(destid) + dlen + dlg_len + clen + cmp_len;
	hlen = tag_size(TCAP_TAG_APPL_CONT) + len_size(pkg_len)
	    mlen = hlen + ilen + dlen ? dlen : clen;
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		pack_tag_appl_cons(&mp->b_wptr, TCAP_TAG_APPL_CONT);
		pack_len(&mp->b_wptr, pkg_len);
		pack_tag_appl_prim(&mp->b_wptr, TCAP_TAG_APPL_ORIGID);
		pack_len(&mp->b_wptr, sizeof(origid));
		pack_int(&mp->b_wptr, origid, sizeof(origid));
		pack_tag_appl_prim(&mp->b_wptr, TCAP_TAG_APPL_DESTID);
		pack_len(&mp->b_wptr, sizeof(destid));
		pack_int(&mp->b_wptr, destid, sizeof(destid));
		if (clen && !dlen) {	/* common case, components no dialog */
			pack_tag_appl_cons(&mp->b_wptr, TCAP_TAG_APPL_CSEQ);
			pack_len(&mp->b_wptr, cmp_len);
			linkb(mp, cp);
			return (mp);
		}
		if (dlen) {	/* oddball case, dialog */
			pack_tag_appl_cons(&mp->b_wptr, TCAP_TAG_APPL_DLGP);
			pack_len(&mp->b_wptr, dlg_len);
			linkb(mp, dp);
		}
		if (clen) {	/* oddbal case, dialog and components */
			if ((mc = allocb(clen, BPRI_MED))) {
				mc->b_datap->db_type = M_DATA;
				pack_tag_appl_cons(&mc->b_wptr, TCAP_TAG_APPL_CSEQ);
				pack_len(&mc->b_wptr, cmp_len);
				linkb(mp, mc);
				linkb(mp, cp);
				return (mp);
			}
			freeb(mp);
			return (NULL);
		}
	}
	return (mp);
}

/*
 *  ITUT ABORT (Abort)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_appl_enc_abt(uint32_t destid, mblk_t * dp, mblk_t * cp)
{
	mblk_t *mp, *mc;
	size_t pkg_len, dlg_len, cmp_len, mlen, hlen, ilen, plen, dlen, clen;
	/* 
	 *  TODO: reduce these to constants where possible
	 */
	dlg_len = dp ? msgdsize(dp) : 0;
	cmp_len = cp ? msgdsize(cp) : 0;
	ilen = tag_size(TCAP_TAG_APPL_DESTID) + len_size(sizeof(destid));
	dlen = dlg_len ? (tag_size(TCAP_TAG_APPL_DLGP) + len_size(dlg_len)) : 0;
	clen = cmp_len ? (tag_size(TCAP_TAG_PAPPLCSEQ) + len_size(cmp_len)) : 0;
	pkg_len = ilen + sizeof(destid) + dlen + dlg_len + clen + cmp_len;
	hlen = tag_size(TCAP_TAG_APPL_ABORT) + len_size(pkg_len)
	    mlen = hlen + ilen + dlen ? dlen : clen;
	if ((mp = allocb(mlen, BPRI_MED))) {
		mp->b_datap->db_type = M_DATA;
		pack_tag_appl_cons(&mp->b_wptr, TCAP_TAG_APPL_ABORT);
		pack_len(&mp->b_wptr, pkg_len);
		pack_tag_appl_prim(&mp->b_wptr, TCAP_TAG_APPL_DESTID);
		pack_len(&mp->b_wptr, sizeof(destid));
		pack_int(&mp->b_wptr, destid, sizeof(destid));
		/* 
		 *  FIXME for cause information rather than components
		 */
		if (clen && !dlen) {	/* common case, components no dialog */
			pack_tag_appl_cons(&mp->b_wptr, TCAP_TAG_APPL_CSEQ);
			pack_len(&mp->b_wptr, cmp_len);
			linkb(mp, cp);
			return (mp);
		}
		if (dlen) {	/* oddball case, dialog */
			pack_tag_appl_cons(&mp->b_wptr, TCAP_TAG_APPL_DLGP);
			pack_len(&mp->b_wptr, dlg_len);
			linkb(mp, dp);
		}
		if (clen) {	/* oddbal case, dialog and components */
			if ((mc = allocb(clen, BPRI_MED))) {
				mc->b_datap->db_type = M_DATA;
				pack_tag_appl_cons(&mc->b_wptr, TCAP_TAG_APPL_CSEQ);
				pack_len(&mc->b_wptr, cmp_len);
				linkb(mp, mc);
				linkb(mp, cp);
				return (mp);
			}
			freeb(mp);
			return (NULL);
		}
	}
	return (mp);
}

/*
 *  -------------------------------------------------------------------------
 *
 *  ANSI TCAP Component (Component (TC) Sub-Layer) encoding.
 *
 *  -------------------------------------------------------------------------
 *
 *  ANSI INKL (Invoke Last)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_priv_enc_inkl(uint32_t * iid, uint32_t * lid,
					 uint opclass, uint opcode, mblk_t * pseq)
{
}

/*
 *  ANSI INK  (Invoke Not Last)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_priv_enc_ink(uint32_t * iid, uint32_t * lid,
					uint opclass, uint opcode, mblk_t * pseq)
{
}

/*
 *  ANSI RRL  (Return Result Last)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_priv_enc_rrl(uint32_t * iid, mblk_t * pseq)
{
}

/*
 *  ANSI RR   (Return Result Not Last)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_priv_enc_rr(uint32_t * iid, mblk_t * pseq)
{
}

/*
 *  ANSI RER  (Return Error)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_priv_enc_rer(uint32_t * iid, uint ecode, mblk_t * pseq)
{
}

/*
 *  ANSI REJ  (Reject)
 *  -------------------------------------------------------------------------
 */
static inline mblk_t *tcap_priv_enc_rej(uint32_t * iid, uint pcode, mblk_t * pseq)
{
}

/*
 *  -------------------------------------------------------------------------
 *
 *  ITUT TCAP Component (Component (TC) Sub-Layer) encoding.
 *
 *  -------------------------------------------------------------------------
 *
 *  ITUT INKL (Invoke Last)
 *  -------------------------------------------------------------------------
 */
/*
 *  ITUT RRL  (Return Result Last)
 *  -------------------------------------------------------------------------
 */
/*
 *  ITUT RR   (Return Result Not Last)
 *  -------------------------------------------------------------------------
 */
/*
 *  ITUT RER  (Return Error)
 *  -------------------------------------------------------------------------
 */
/*
 *  ITUT REJ  (Reject)
 *  -------------------------------------------------------------------------
 */

#endif				/* __TCAP_PDU_H__ */


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

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

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