OpenSS7 SS7 for the Common Man |
© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved. |
||||||||||||||||||||||||||
Home | Overview | Status | News | Documentation | Resources | About | |||||||||||||||||||||
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__ */
|
|||||||||||||||||||||||||||
OpenSS7 SS7 for the Common Man |
Home | Overview | Status | News | Documentation | Resources | About | ||||||||||||||||||||
© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved. |