📄 m2pa_sdl.c
字号:
} while(0); rare(); return m_error_reply(m2, err); /* XXX */}/* * SDL_DAEDR_START_REQ * --------------------------------------------- */static intsdl_daedr_start_req(m2pa_t *m2, mblk_t *mp){ int err; size_t mlen = mp->b_wptr - mp->b_rptr; sdl_daedr_start_req_t *p = (sdl_daedr_start_req_t *)mp->b_rptr; do { if ( mlen >= sizeof(*p) ) { if ( m2->state == LMI_ENABLED ) { /* enable the receiver section */ m2->flags |= M2PA_FLAG_RX_ENABLED; m2->rx_status = -1; m2->count = 0; return(0); } seldom(); err = LMI_OUTSTATE; break; /* would place interface out of state */ } seldom(); err = LMI_PROTOSHORT; break; /* M_PROTO block too short */ } while(0); rare(); return m_error_reply(m2, err); /* XXX */}/* * ========================================================================= * * NPI User (M2PA) <- NPI Provider (SCTP) Primitives * * ========================================================================= *//* * N_CONN_IND * --------------------------------------------- */static intn_conn_ind(m2pa_t *m2, mblk_t *mp){ (void)m2; (void)mp;// fixme(("Do something here...\n")); return(0); m2->state = LMI_DISABLED; return lmi_error_ind(m2, LMI_DISC);}/* * N_CONN_CON * --------------------------------------------- */static intn_conn_con(m2pa_t *m2, mblk_t *mp){ (void)m2; (void)mp;// fixme(("Do something here...\n")); return(0); m2->state = LMI_DISABLED; return lmi_error_ind(m2, LMI_DISC);}/* * N_DISCON_IND * --------------------------------------------- */static intn_discon_ind(m2pa_t *m2, mblk_t *mp){ (void)m2; (void)mp;// fixme(("Do something here...\n")); return(0); m2->state = LMI_DISABLED; return lmi_error_ind(m2, LMI_DISC);}/* * N_DATA_IND * --------------------------------------------- */static intn_data_ind(m2pa_t *m2, mblk_t *mp){ int err; mblk_t *dp; size_t mlen = mp->b_wptr - mp->b_rptr; N_data_ind_t *p = (N_data_ind_t *)mp->b_rptr; ensure( mlen >= sizeof(*p), return(-EFAULT) ); if ( (dp = mp->b_cont) ) { if ( m2->state == LMI_ENABLED ) { if ( m2->flags & M2PA_FLAG_RX_ENABLED ) { if ( (err = m2pa_recv_msg(m2, dp)) ) return(err); mp->b_cont = NULL; /* absorbed data */ } return(0); } rare(); return(-EPROTO); /* ignore data in other states */ } rare(); return(-EFAULT);}/* * N_EXDATA_IND * --------------------------------------------- */static intn_exdata_ind(m2pa_t *m2, mblk_t *mp){ int err; mblk_t *dp; size_t mlen = mp->b_wptr - mp->b_rptr; N_exdata_ind_t *p = (N_exdata_ind_t *)mp->b_rptr; ensure( mlen >= sizeof(*p), return(-EFAULT) ); if ( (dp = mp->b_cont) ) { if ( m2->state == LMI_ENABLED ) { if ( m2->flags & M2PA_FLAG_RX_ENABLED ) { if ( (err = m2pa_recv_msg(m2, dp)) ) return(err); mp->b_cont = NULL; /* absorbed data */ } return(0); } rare(); return(-EPROTO); /* ignore data in other states */ } rare(); return(-EFAULT);}/* * N_DATACK_IND * --------------------------------------------- */static intn_datack_ind(m2pa_t *m2, mblk_t *mp){ int err; size_t mlen = mp->b_wptr - mp->b_rptr; N_datack_ind_t *p = (N_datack_ind_t *)mp->b_rptr; ensure( mlen >= sizeof(*p), return(-EFAULT) ); if ( m2->version >= M2PA_VERSION_DRAFT4 ) { if ( m2->sacks ) { m2->sacks--; return(0); } if ( m2->dacks ) { uint bsnr = m2->bsnr; m2->bsnr++; if ( (err = m2pa_deliver(m2, M2PA_FISU, NULL)) ) { m2->bsnr = bsnr; return(err); } m2->dacks--; return(0); } } seldom(); return(-EPROTO);}/* * N_INFO_ACK * --------------------------------------------- */static intn_info_ack(m2pa_t *m2, mblk_t *mp){ (void)m2; (void)mp;// fixme(("Do something here...\n")); return(0); m2->state = LMI_DISABLED; return lmi_error_ind(m2, LMI_DISC);}/* * N_BIND_ACK * --------------------------------------------- */static intn_bind_ack(m2pa_t *m2, mblk_t *mp){ (void)m2; (void)mp;// fixme(("Do something here...\n")); return(0); m2->state = LMI_DISABLED; return lmi_error_ind(m2, LMI_DISC);}/* * N_OK_ACK * --------------------------------------------- */static intn_ok_ack(m2pa_t *m2, mblk_t *mp){ (void)m2; (void)mp;// fixme(("Do something here...\n")); return(0); m2->state = LMI_DISABLED; return lmi_error_ind(m2, LMI_DISC);}/* * N_ERROR_ACK * --------------------------------------------- */static intn_error_ack(m2pa_t *m2, mblk_t *mp){ (void)m2; (void)mp;// fixme(("Do something here...\n")); return(0); m2->state = LMI_DISABLED; return lmi_error_ind(m2, LMI_DISC);}/* * N_RESET_IND * --------------------------------------------- */static intn_reset_ind(m2pa_t *m2, mblk_t *mp){ (void)m2; (void)mp;// fixme(("Do something here...\n")); return(0); m2->state = LMI_DISABLED; return lmi_error_ind(m2, LMI_DISC);}/* * N_RESET_CON * --------------------------------------------- */static intn_reset_con(m2pa_t *m2, mblk_t *mp){ (void)m2; (void)mp;// fixme(("Do something here...\n")); return(0); m2->state = LMI_DISABLED; return lmi_error_ind(m2, LMI_DISC);}/* * ========================================================================= * * IO Controls * * ========================================================================= * I have only implemented enough of these to get the Q.781 test programs * running. *//* * SDL_IOCGOPTIONS * --------------------------------------------- */static intsdl_iocgoptions(queue_t *q, int cmd, void *arg){ m2pa_t *m2 = (m2pa_t *)q->q_ptr; lmi_option_t *opt = (lmi_option_t *)arg; *opt = m2->options; return(0);}/* * SDL_IOCSOPTIONS * --------------------------------------------- */static intsdl_iocsoptions(queue_t *q, int cmd, void *arg){ m2pa_t *m2 = (m2pa_t *)q->q_ptr; lmi_option_t *opt = (lmi_option_t *)arg; switch ( opt->pvar ) { case SS7_PVAR_ITUT_88: case SS7_PVAR_ITUT_93: case SS7_PVAR_ITUT_96: case SS7_PVAR_ITUT_00: case SS7_PVAR_ANSI_88: case SS7_PVAR_ANSI_92: case SS7_PVAR_ANSI_96: case SS7_PVAR_ANSI_00: case SS7_PVAR_ETSI_88: case SS7_PVAR_ETSI_93: case SS7_PVAR_ETSI_96: case SS7_PVAR_ETSI_00: case SS7_PVAR_JTTC_94: break; default: rare(); return(-EINVAL); } if ( opt->popt & ~(SS7_POPT_MPLEV|SS7_POPT_HSL|SS7_POPT_XSN) ) { rare(); return(-EINVAL); } m2->options = *opt; return(0);}/* * SDL_IOCGCONFIG * --------------------------------------------- */static intsdl_iocgconfig(queue_t *q, int cmd, void *arg){ m2pa_t *m2 = (m2pa_t *)q->q_ptr; sdl_config_t *cnf = (sdl_config_t *)arg; *cnf = m2->config; return(0);}/* * SDL_IOCSCONFIG * --------------------------------------------- */static intsdl_iocsconfig(queue_t *q, int cmd, void *arg){ m2pa_t *m2 = (m2pa_t *)q->q_ptr; sdl_config_t *cnf = (sdl_config_t *)arg; m2->config = *cnf; return(0);}/* * DEV_IOCSIFCLOCK * --------------------------------------------- */static intdev_iocsifclock(queue_t *q, int cmd, void *arg){ m2pa_t *m2 = (m2pa_t *)q->q_ptr; ulong *val = (ulong *)arg; switch ( *val ) { case DEV_CLOCK_NONE: case DEV_CLOCK_ABR: case DEV_CLOCK_SHAPER: case DEV_CLOCK_TICK: m2->ifclock = *val; return(0); default: case DEV_CLOCK_INT: case DEV_CLOCK_EXT: case DEV_CLOCK_LOOP: case DEV_CLOCK_MASTER: case DEV_CLOCK_SLAVE: case DEV_CLOCK_DPLL: break; } return(-EINVAL);}/* * DEV_IOCGIFCLOCK * --------------------------------------------- */static intdev_iocgifclock(queue_t *q, int cmd, void *arg){ m2pa_t *m2 = (m2pa_t *)q->q_ptr; ulong *val = (ulong *)arg; *val = m2->ifclock; return(0);}/* * DEV_IOCCDISCTX * --------------------------------------------- * Disconnect the transmit path. */static intdev_ioccdisctx(queue_t *q, int cmd, void *arg){ return(-EOPNOTSUPP);}/* * DEV_IOCCCONNTX * --------------------------------------------- * Reconnect the transmit path. */static intdev_ioccconntx(queue_t *q, int cmd, void *arg){ return(-EOPNOTSUPP);}/* * ========================================================================= * * STREAMS Message Handling * * ========================================================================= * ------------------------------------------------------------------------- * * M_PROTO, M_PCPROTO Handling * * ------------------------------------------------------------------------- */static intm2pa_w_proto(queue_t *q, mblk_t *mp){ int rtn; ulong prim; m2pa_t *m2 = (m2pa_t *)q->q_ptr; ulong oldstate = m2->state; switch ( (prim = *((ulong *)mp->b_rptr)) ) { case LMI_INFO_REQ: rtn = lmi_info_req (m2, mp); break; case LMI_ATTACH_REQ: rtn = lmi_attach_req (m2, mp); break; case LMI_DETACH_REQ: rtn = lmi_detach_req (m2, mp); break; case LMI_ENABLE_REQ: rtn = lmi_enable_req (m2, mp); break; case LMI_DISABLE_REQ: rtn = lmi_disable_req (m2, mp); break; case LMI_OPTMGMT_REQ: rtn = lmi_optmgmt_req (m2, mp); break; case SDL_DAEDT_TRANSMISSION_REQ: rtn = sdl_daedt_xmit_req (m2, mp); break; case SDL_DAEDT_START_REQ: rtn = sdl_daedt_start_req (m2, mp); break; case SDL_DAEDR_START_REQ: rtn = sdl_daedr_start_req (m2, mp); break; default: rtn = -EOPNOTSUPP; break; } if ( rtn < 0 ) { seldom(); m2->state = oldstate; } return(rtn);}static intm2pa_r_proto(queue_t *q, mblk_t *mp){ int rtn; ulong prim; m2pa_t *m2 = (m2pa_t *)q->q_ptr; switch ( (prim = *((ulong *)mp->b_rptr)) ) { case N_CONN_IND: rtn = n_conn_ind (m2, mp); break; case N_CONN_RES: rtn = n_conn_con (m2, mp); break; case N_DISCON_IND: rtn = n_discon_ind (m2, mp); break; case N_DATA_IND: rtn = n_data_ind (m2, mp); break; case N_EXDATA_IND: rtn = n_exdata_ind (m2, mp); break; case N_DATACK_IND: rtn = n_datack_ind (m2, mp); break; case N_INFO_ACK: rtn = n_info_ack (m2, mp); break; case N_BIND_ACK: rtn = n_bind_ack (m2, mp); break; case N_OK_ACK: rtn = n_ok_ack (m2, mp); break; case N_ERROR_ACK: rtn = n_error_ack (m2, mp); break; case N_RESET_IND: rtn = n_reset_ind (m2, mp); break; case N_RESET_CON: rtn = n_reset_con (m2, mp); break; default: rtn = -EOPNOTSUPP; break; } if ( rtn < 0 ) { seldom(); } return(rtn);}/* * ------------------------------------------------------------------------- * * M_DATA Handling * * ------------------------------------------------------------------------- */static intm2pa_w_data(queue_t *q, mblk_t *mp){ int err; m2pa_t *m2 = (m2pa_t *)q->q_ptr; if ( (err = sdl_write(m2, mp)) ) return(err); return(1); /* message absorbed */}static intm2pa_r_data(queue_t *q, mblk_t *mp){ int err; m2pa_t *m2 = (m2pa_t *)q->q_ptr; if ( (err = m2pa_recv_msg(m2, mp)) ) return(err); return(1); /* message absorbed */}/* * ------------------------------------------------------------------------- * * M_CTL Handling (Events) * * ------------------------------------------------------------------------- */static intm2pa_r_ctl(queue_t *q, mblk_t *mp){ m2pa_t *m2 = (m2pa_t *)q->q_ptr; switch ( *mp->b_rptr ) { case M2PA_EVENT_TX_SIB_TIMEOUT: m2->flags &= ~M2PA_FLAG_TX_BUSY; m2pa_send_status(m2, M2PA_STATUS_BUSY_ENDED); return(0); case M2PA_EVENT_RX_SIB_TIMEOUT: m2pa_deliver(m2, M2PA_LSSU_SIB, NULL); return(0); } return(-EOPNOTSUPP);}/* * ------------------------------------------------------------------------- * * M_IOCTL Handling * * ------------------------------------------------------------------------- */static intm2pa_w_ioctl(queue_t *q, mblk_t *mp){ struct iocblk *iocp = (struct iocblk *)mp->b_rptr; void *arg = mp->b_cont?mp->b_cont->b_rptr:NULL; int cmd = iocp->ioc_cmd, count = iocp->ioc_count; struct linkblk *lp = (struct linkblk *)arg; int ret = -EINVAL; int type = _IOC_TYPE(cmd); int nr = _IOC_NR(cmd); int size = _IOC_SIZE(cmd); (void)nr; switch ( type )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -