📄 sdt.c
字号:
* LMI_EVENT_IND * ----------------------------------- */STATIC INLINE intlmi_event_ind(queue_t *q, struct sdt *s, ulong oid, ulong level, caddr_t inf_ptr, size_t inf_len){ mblk_t *mp; lmi_event_ind_t *p; if ((mp = ss7_allocb(q, sizeof(*p) + inf_len, BPRI_MED))) { mp->b_datap->db_type = M_PROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->lmi_primitive = LMI_EVENT_IND; p->lmi_objectid = oid; p->lmi_timestamp = jiffies; p->lmi_severity = level; bcopy(inf_ptr, mp->b_wptr, inf_len); mp->b_wptr += inf_len; printd(("%s: %p: <- LMI_EVENT_IND\n", MOD_NAME, s)); putnext(s->oq, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}#endif/* * SDT_RC_SIGNAL_UNIT_IND * ----------------------------------- */STATIC INLINE intsdt_rc_signal_unit_ind(queue_t *q, struct sdt *s, mblk_t *dp, ulong count){ if (count == 1) { printd(("%s: %p: <- M_DATA [%d]\n", MOD_NAME, s, msgdsize(dp))); putnext(s->oq, dp); return (QR_DONE); } else if (count > 1) { mblk_t *mp; sdt_rc_signal_unit_ind_t *p; if ((mp = ss7_allocb(q, sizeof(*p), BPRI_MED))) { mp->b_datap->db_type = M_PROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->sdt_primitive = SDT_RC_SIGNAL_UNIT_IND; p->sdt_count = count; mp->b_cont = dp; printd(("%s: %p: <- SDT_RC_SIGNAL_UNIT_IND [%lu x %d]\n", MOD_NAME, s, count, msgdsize(dp))); putnext(s->oq, mp); return (QR_DONE); } rare(); return (-ENOBUFS); } swerr(); return (-EFAULT);}/* * SDT_RC_CONGESTION_ACCEPT_IND * ----------------------------------- */STATIC INLINE intsdt_rc_congestion_accept_ind(queue_t *q, struct sdt *s){ mblk_t *mp; sdt_rc_congestion_accept_ind_t *p; if ((mp = ss7_allocb(q, sizeof(*p), BPRI_MED))) { mp->b_datap->db_type = M_PCPROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->sdt_primitive = SDT_RC_CONGESTION_ACCEPT_IND; printd(("%s: %p: <- SDT_RC_CONGESTION_ACCEPT_IND\n", MOD_NAME, s)); putnext(s->oq, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}#if 0/* * SDT_RC_CONGESTION_DISCARD_IND * ----------------------------------- */STATIC INLINE intsdt_rc_congestion_discard_ind(queue_t *q, struct sdt *s){ mblk_t *mp; sdt_rc_congestion_discard_ind_t *p; if ((mp = ss7_allocb(q, sizeof(*p), BPRI_MED))) { mp->b_datap->db_type = M_PCPROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->sdt_primitive = SDT_RC_CONGESTION_DISCARD_IND; printd(("%s: %p: <- SDT_RC_CONGESTION_DISCARD_IND\n", MOD_NAME, s)); putnext(s->oq, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}#endif/* * SDT_RC_NO_CONGESTION_IND * ----------------------------------- */STATIC INLINE intsdt_rc_no_congestion_ind(queue_t *q, struct sdt *s){ mblk_t *mp; sdt_rc_no_congestion_ind_t *p; if ((mp = ss7_allocb(q, sizeof(*p), BPRI_MED))) { mp->b_datap->db_type = M_PCPROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->sdt_primitive = SDT_RC_NO_CONGESTION_IND; printd(("%s: %p: <- SDT_RC_NO_CONGESTION_IND\n", MOD_NAME, s)); putnext(s->oq, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}/* * SDT_IAC_CORRECT_SU_IND * ----------------------------------- */STATIC INLINE intsdt_iac_correct_su_ind(queue_t *q, struct sdt *s){ mblk_t *mp; sdt_iac_correct_su_ind_t *p; if ((mp = ss7_allocb(q, sizeof(*p), BPRI_MED))) { mp->b_datap->db_type = M_PROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->sdt_primitive = SDT_IAC_CORRECT_SU_IND; printd(("%s: %p: <- SDT_IAC_CORRECT_SU_IND\n", MOD_NAME, s)); putnext(s->oq, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}/* * SDT_IAC_ABORT_PROVING_IND * ----------------------------------- */STATIC INLINE intsdt_iac_abort_proving_ind(queue_t *q, struct sdt *s){ mblk_t *mp; sdt_iac_abort_proving_ind_t *p; if ((mp = ss7_allocb(q, sizeof(*p), BPRI_MED))) { mp->b_datap->db_type = M_PCPROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->sdt_primitive = SDT_IAC_ABORT_PROVING_IND; printd(("%s: %p: <- SDT_IAC_ABORT_PROVING_IND\n", MOD_NAME, s)); putnext(s->oq, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}/* * SDT_LSC_LINK_FAILURE_IND * ----------------------------------- */STATIC INLINE intsdt_lsc_link_failure_ind(queue_t *q, struct sdt *s){ mblk_t *mp; sdt_lsc_link_failure_ind_t *p; if ((mp = ss7_allocb(q, sizeof(*p), BPRI_MED))) { mp->b_datap->db_type = M_PCPROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->sdt_primitive = SDT_LSC_LINK_FAILURE_IND; printd(("%s: %p: <- SDT_LSC_LINK_FAILURE_IND\n", MOD_NAME, s)); putnext(s->oq, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}#if 0/* We let back-enabling do this for us *//* * SDT_TXC_TRANSMISSION_REQUEST_IND * ----------------------------------- */STATIC INLINE intsdt_txc_transmission_request_ind(queue_t *q, struct sdt *s){ mblk_t *mp; sdt_txc_transmission_request_ind_t *p; if ((mp = ss7_allocb(q, sizeof(*p), BPRI_MED))) { mp->b_datap->db_type = M_PCPROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->sdt_primitive = SDT_TXC_TRANSMISSION_REQUEST_IND; printd(("%s: %p: <- SDT_TXC_TRANSMISSION_REQUEST_IND\n", MOD_NAME, s)); putnext(s->oq, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}#endif/* * ======================================================================== * * PRIMITIVES Sent Downstream * * ======================================================================== *//* * LMI_INFO_REQ * ----------------------------------- */STATIC INLINE intsdl_info_req(queue_t *q, struct sdt *s){ mblk_t *mp; lmi_info_req_t *p; if ((mp = ss7_allocb(q, sizeof(*p), BPRI_MED))) { mp->b_datap->db_type = M_PCPROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->lmi_primitive = LMI_INFO_REQ; printd(("%s: %p: LMI_INFO_REQ ->\n", MOD_NAME, s)); putnext(s->iq, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}#if 0/* We don't need any of these because these are just passed along. *//* * LMI_ATTACH_REQ * ----------------------------------- */STATIC INLINE intsdl_attach_req(queue_t *q, struct sdt *s, caddr_t ppa_ptr, size_t ppa_len){ mblk_t *mp; lmi_attach_req_t *p; if ((mp = ss7_allocb(q, sizeof(*p) + ppa_len, BPRI_MED))) { mp->b_datap->db_type = M_PCPROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->lmi_primitive = LMI_ATTACH_REQ; bcopy(ppa_ptr, mp->b_wptr, ppa_len); mp->b_wptr += ppa_len; printd(("%s: %p: LMI_ATTACH_REQ ->\n", MOD_NAME, s)); putnext(s->iq, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}/* * LMI_DETACH_REQ * ----------------------------------- */STATIC INLINE intsdl_detach_req(queue_t *q, struct sdt *s){ mblk_t *mp; lmi_detach_req_t *p; if ((mp = ss7_allocb(q, sizeof(*p), BPRI_MED))) { mp->b_datap->db_type = M_PCPROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->lmi_primitive = LMI_DETACH_REQ; printd(("%s: %p: LMI_DETACH_REQ ->\n", MOD_NAME, s)); putnext(s->iq, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}/* * LMI_ENABLE_REQ * ----------------------------------- */STATIC INLINE intsdl_enable_req(queue_t *q, struct sdt *s){ mblk_t *mp; lmi_enable_req_t *p; if ((mp = ss7_allocb(q, sizeof(*p), BPRI_MED))) { mp->b_datap->db_type = M_PCPROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->lmi_primitive = LMI_ENABLE_REQ; printd(("%s: %p: LMI_ENABLE_REQ ->\n", MOD_NAME, s)); putnext(s->iq, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}/* * LMI_DISABLE_REQ * ----------------------------------- */STATIC INLINE intsdl_disable_req(queue_t *q, struct sdt *s){ mblk_t *mp; lmi_disable_req_t *p; if ((mp = ss7_allocb(q, sizeof(*p), BPRI_MED))) { mp->b_datap->db_type = M_PCPROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->lmi_primitive = LMI_DISABLE_REQ; printd(("%s: %p: LMI_DISABLE_REQ ->\n", MOD_NAME, s)); putnext(s->iq, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}/* * LMI_OPTMGMT_REQ * ----------------------------------- */STATIC INLINE intsdl_optmgmt_req(queue_t *q, struct sdt *s, long flags, caddr_t opt_ptr, size_t opt_len){ mblk_t *mp; lmi_optmgmt_req_t *p; if ((mp = ss7_allocb(q, sizeof(*p) + opt_len, BPRI_MED))) { mp->b_datap->db_type = M_PCPROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->lmi_primitive = LMI_OPTMGMT_REQ; p->lmi_opt_length = opt_len; p->lmi_opt_offset = opt_len ? sizeof(*p) : 0; p->lmi_mgmt_flags = flags; bcopy(opt_ptr, mp->b_wptr, opt_len); mp->b_wptr += opt_len; printd(("%s: %p: LMI_OPTMGMT_REQ ->\n", MOD_NAME, s)); putnext(s->iq, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}#endif#if 0/* * SDL_BITS_FOR_TRANSMISSION_REQ * ----------------------------------- * This is the non-prefferred method for sending transmitted bits. The * preferred method is to send just an M_DATA block. */STATIC INLINE intsdl_bits_for_transmission_req(queue_t *q, struct sdt *s, mblk_t *dp){ mblk_t *mp; sdl_bits_for_transmission_req_t *p; if ((mp = ss7_allocb(q, sizeof(*p), BPRI_MED))) { mp->b_datap->db_type = M_PROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->sdl_primitive = SDL_BITS_FOR_TRANSMISSION_REQ; mp->b_cont = dp; printd(("%s: %p: SDL_BITS_FOR_TRANSMISSION [%d] ->\n", MOD_NAME, s, msgdsize(dp))); putnext(s->iq, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}/* * SDL_CONNECT_REQ * ----------------------------------- */STATIC INLINE intsdl_connect_req(queue_t *q, struct sdt *s){ mblk_t *mp; sdl_connect_req_t *p; if ((mp = ss7_allocb(q, sizeof(*p), BPRI_MED))) { mp->b_datap->db_type = M_PCPROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->sdl_primitive = SDL_CONNECT_REQ; printd(("%s: %p: SDL_CONNECT_REQ ->\n", MOD_NAME, s)); putnext(s->iq, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}/* * SDL_DISCONNECT_REQ * ----------------------------------- */STATIC INLINE intsdl_disconnect_req(queue_t *q, struct sdt *s){ mblk_t *mp; sdl_disconnect_req_t *p; if ((mp = ss7_allocb(q, sizeof(*p), BPRI_MED))) { mp->b_datap->db_type = M_PCPROTO; p = (typeof(p)) mp->b_wptr; mp->b_wptr += sizeof(*p); p->sdl_primitive = SDL_DISCONNECT_REQ; printd(("%s: %p: SDL_DISCONNECT_REQ ->\n", MOD_NAME, s)); putnext(s->iq, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}#endif/* * ========================================================================= * * PROTOCOL STATE MACHINE FUNCTIONS * * ========================================================================= *//* * ------------------------------------------------------------------------- * * Timers * * ------------------------------------------------------------------------- */enum { tall, t8 };SS7_DECLARE_TIMER(MOD_NAME, sdt, t8, config);STATIC INLINE void__sdt_timer_stop(struct sdt *s, const uint t){ int single = 1; switch (t) { case tall: single = 0; /* fall through */ case t8: sdt_stop_timer_t8(s); if (single) break; /* fall through */ break; default: swerr(); break; }}STATIC INLINE voidsdt_timer_stop(struct sdt *s, const uint t){ psw_t flags; spin_lock_irqsave(&s->lock, flags); { __sdt_timer_stop(s, t); } spin_unlock_irqrestore(&s->lock, flags);}STATIC INLINE voidsdt_timer_start(struct sdt *s, const uint t){ psw_t flags; spin_lock_irqsave(&s->lock, flags); { __sdt_timer_stop(s, t); switch (t) { case t8: sdt_start_timer_t8(s); break; default: swerr(); break; } } spin_unlock_irqrestore(&s->lock, flags);}/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -