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/slsi/sls_hmdc.h#ident "@(#) $Id: sls_hmdc.h,v 0.8.2.1 2002/10/18 02:40:37 brian Exp $" #ifndef __SLS_HMDC_H__ #define __SLS_HMDC_H__ /* * This is the Signalling Link Set version of the HMDC state machine. If the * message is a management message which can be handled by the link set state * machines it is handled here. Otherwise, the message is forwarded to the * MTP state machines. In any case, the message is decoded to the extent * that it can be determined whether the message is a management or user part * message. No other parsing of the received message is necessary. If the * message is passed on to the MTP for further discrimination, it is passed * already parsed. */ static inline void mtp_hmdt_message_for_distribution(ls_t * ls, mblk_t * mp) { mp->b_data->db_type = M_PROTO; *((ls_ulong *) mp->b_rptr) = LS_HMDT_MESSAGE_FOR_DISTRIBUTION_IND; putq(ls->rq, mp); return; } static inline void ls_hmrt_message_for_routing(ls_t * ls, mblk_t * mp) { mp->b_data->db_type = M_PROTO; *((ls_ulong *) mp->b_rptr) = LS_HMRT_MESSAGE_FOR_ROUTING_IND; putq(ls->rq, mp); return; } static inline void ls_hmdt_message_for_distribution(lk_t * lk, mblk_t * mp) { ls_t *ls = lk->module; union LS_primitives *p = (union LS_primitives *) mp->b_rptr; if (ls->statem.own_sp_restart) { swtich(p->sig.signal) { case LS_SIGNAL_TFP: case LS_SIGNAL_TFR: case LS_SIGNAL_TFA: case LS_SIGNAL_TRA: case LS_SIGNAL_SLTM: case LS_SIGNAL_SLTA: case LS_SIGNAL_SSLTM: case LS_SIGNAL_SSLTA: break; default: /* discard all other messages while restarting */ freemsg(mp); return; } } switch (p->sig.signal) { case LS_SIGNAL_COO: case LS_SIGNAL_COA: case LS_SIGNAL_CBD: case LS_SIGNAL_CBA: case LS_SIGNAL_ECO: case LS_SIGNAL_ECA: if (p->sig.mh.opc != ls->config.apc) { /* sender is not adjacent, not for us, for another linkset */ mtp_hmdt_message_for_distribution(ls, mp); return; } switch (p->sig.signal) { case LS_SIGNAL_COO: ls_tcoc_changeover_order(ls, mp); break; case LS_SIGNAL_COA: ls_tcoc_changeover_ack(ls, mp); break; case LS_SIGNAL_CBD: lk_tcbc_changeback_declaration(ls, mp); break; case LS_SIGNAL_CBA: lk_tcbc_changeback_ack(ls, mp); break; case LS_SIGNAL_ECO: ls_tcoc_emergency_changeover_order(ls, mp); break; case LS_SIGNAL_ECA: ls_tcoc_emergency_changeover_ack(ls, mp); break; } break; case LS_SIGNAL_SLTM: case LS_SIGNAL_SLTA: case LS_SIGNAL_SSLTM: case LS_SIGNAL_SSLTA: if (p->sig.mh.opc != ls->config.apc) { /* sender is not adjacent, not for us, for another linkset */ /* this is an error, perhaps we should log it */ freemsg(mp); return; } switch (p->sig.signal) { case LS_SIGNAL_SLTM: lk_sltc_signalling_link_test_msg(lk, mp); break; case LS_SIGNAL_SLTA: lk_sltc_signalling_link_test_ack(lk, mp); break; case LS_SIGNAL_SSLTM: lk_sltc_signalling_link_test_msg_special(lk, mp); break; case LS_SIGNAL_SSLTA: lk_sltc_signalling_link_test_ack_special(lk, mp); break; } break; case LS_SIGNAL_LIN: case LS_SIGNAL_LIA: case LS_SIGNAL_LUN: case LS_SIGNAL_LUA: case LS_SIGNAL_LID: case LS_SIGNAL_LFU: case LS_SIGNAL_LLI: case LS_SIGNAL_LRI: if (p->sig.mh.opc != ls->config.apc) { /* sender is not adjacent, not for us, for another linkset */ mtp_hmdt_message_for_distribution(ls, mp); return; } switch (p->sig.signal) { case LS_SIGNAL_LIN: lk_tlac_remote_inhibit_signalling_link(lk, mp); break; case LS_SIGNAL_LIA: lk_tlac_inhibit_ack(lk, mp); break; case LS_SIGNAL_LUN: lk_tlac_remote_uninhibit_signalling_link(lk, mp); break; case LS_SIGNAL_LUA: lk_tlac_unihibit_ack(lk, mp); break; case LS_SIGNAL_LID: lk_tlac_local_inhibit_denied(lk, mp); break; case LS_SIGNAL_LFU: lk_tlac_force_unihibit_signalling_link(lk, mp); break; case LS_SIGNAL_LLI: lk_tlac_local_inhibit_test(lk, mp); break; case LS_SIGNAL_LRI: lk_tlac_remote_inhibit_test(lk, mp); break; } break; case LS_SIGNAL_DLC: case LS_SIGNAL_CSS: case LS_SIGNAL_CNS: case LS_SIGNAL_CNP: if (p->sig.mh.opc != ls->config.apc) { /* sender is not adjacent, not for us, for another linkset */ mtp_hmdt_message_for_distribution(ls, mp); return; } switch (p->sig.signal) { case LS_SIGNAL_DLC: lk_lsda_signalling_data_link_connection_order(lk, mp); break; case LS_SIGNAL_CSS: lk_lsda_connection_successful(lk, mp); break; case LS_SIGNAL_CNS: lk_lsda_connection_not_successful(lk, mp); break; case LS_SIGNAL_CNP: lk_lsda_connection_not_possible(lk, mp); break; } break; case LS_SIGNAL_TFC: case LS_SIGNAL_RCT: case LS_SIGNAL_TFP: case LS_SIGNAL_TFR: case LS_SIGNAL_TFA: case LS_SIGNAL_RSP: case LS_SIGNAL_RSR: case LS_SIGNAL_RCP: case LS_SIGNAL_RCR: case LS_SIGNAL_UPU: case LS_SIGNAL_TRA: case LS_SIGNAL_TRW: case LS_SIGNAL_USER: mtp_hmdt_message_for_distribution(ls, mp); break; default: freemsg(mp); /* should be logged */ return; } } /* * Consistent with: * * Signalling Message Handling (SMH) * Message Discrimination (HMDC) * Figure 24/Q.704 * Figure 24/T1.111.4 */ static inline void ls_hmdc_received_message(lk_t * lk, mblk_t * mp) { union LS_primitives *p; ls_t *ls = lk->module; if (ls_parse_msu(ls, mp)) { /* completely parses management messages */ /* discard if parse fails - we may want to log or report this later */ freemsg(mp); return; } p = (union LS_primitives *) mp->b_rptr; if (ls->config.lpc == p->sig.mh.dpc) ls_hmdt_message_for_distribution(lk, mp); else { if (ls->statem.own_sp_restart) { /* discard message during sp restart */ freemsg(mp); return; } else ls_hmrt_message_for_routing(ls, mp); } } #endif /* __SLS_HMDC_H__ */
|
|||||||||||||||||||||||||||
OpenSS7 SS7 for the Common Man |
Home | Overview | Status | News | Documentation | Resources | About | ||||||||||||||||||||
© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved. |