📄 sdl_sctp.c
字号:
return(0); } seldom(); return(-EBUSY); /* flow controlled */ } seldom(); return(0); /* ignore unless enabled */ } rare(); return(-EPROTO); /* ignore data in other states */ } rare(); return(-EFAULT); } rare(); return(-EMSGSIZE);}/* * N_DATACK_IND * --------------------------------------------- */static intn_datack_ind(sdl_t *sp, mblk_t *mp){ ensure( sp , return(-EFAULT) ); ensure( mp , return(-EFAULT) ); (void)sp; (void)mp; rare(); return(0);}/* * N_INFO_ACK * --------------------------------------------- */static intn_info_ack(sdl_t *sp, mblk_t *mp){ ensure( sp , return(-EFAULT) ); ensure( mp , return(-EFAULT) ); (void)sp; (void)mp; rare(); return(0);}/* * N_BIND_ACK * --------------------------------------------- */static intn_bind_ack(sdl_t *sp, mblk_t *mp){ ensure( sp , return(-EFAULT) ); ensure( mp , return(-EFAULT) ); (void)sp; (void)mp; rare(); return(0);}/* * N_OK_ACK * --------------------------------------------- */static intn_ok_ack(sdl_t *sp, mblk_t *mp){ ensure( sp , return(-EFAULT) ); ensure( mp , return(-EFAULT) ); (void)sp; (void)mp; rare(); return(0);}/* * N_ERROR_ACK * --------------------------------------------- */static intn_error_ack(sdl_t *sp, mblk_t *mp){ ensure( sp , return(-EFAULT) ); ensure( mp , return(-EFAULT) ); (void)sp; (void)mp; rare(); return(0);}/* * N_RESET_IND * --------------------------------------------- */static intn_reset_ind(sdl_t *sp, mblk_t *mp){ ensure( sp , return(-EFAULT) ); ensure( mp , return(-EFAULT) ); (void)sp; (void)mp; rare(); return(0);}/* * N_RESET_CON * --------------------------------------------- */static intn_reset_con(sdl_t *sp, mblk_t *mp){ ensure( sp , return(-EFAULT) ); ensure( mp , return(-EFAULT) ); (void)sp; (void)mp; rare(); return(0);}/* * ========================================================================= * * 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){ sdl_t *sp; lmi_option_t *opt = (lmi_option_t *)arg; ensure( q , return(-EFAULT) ); sp = (sdl_t *)q->q_ptr; ensure( sp , return(-EFAULT) ); ensure( arg, return(-EFAULT) ); *opt = sp->lmi_conf; return(0);}/* * SDL_IOCSOPTIONS * --------------------------------------------- */static intsdl_iocsoptions(queue_t *q, int cmd, void *arg){ sdl_t *sp; lmi_option_t *opt = (lmi_option_t *)arg; ensure( q , return(-EFAULT) ); sp = (sdl_t *)q->q_ptr; ensure( sp , return(-EFAULT) ); ensure( arg, return(-EFAULT) ); 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); } sp->lmi_conf = *opt; return(0);}/* * SDL_IOCGCONFIG * --------------------------------------------- */static intsdl_iocgconfig(queue_t *q, int cmd, void *arg){ sdl_t *sp; sdl_config_t *cnf = (sdl_config_t *)arg; ensure( q , return(-EFAULT) ); sp = (sdl_t *)q->q_ptr; ensure( sp , return(-EFAULT) ); ensure( arg, return(-EFAULT) ); *cnf = sp->sdl_conf; return(0);}/* * SDL_IOCSCONFIG * --------------------------------------------- */static intsdl_iocsconfig(queue_t *q, int cmd, void *arg){ sdl_t *sp; sdl_config_t *cnf = (sdl_config_t *)arg; ensure( q , return(-EFAULT) ); sp = (sdl_t *)q->q_ptr; ensure( sp , return(-EFAULT) ); ensure( arg, return(-EFAULT) ); sp->sdl_conf = *cnf; return(0);}/* * DEV_IOCSIFCLOCK * --------------------------------------------- */static intdev_iocsifclock(queue_t *q, int cmd, void *arg){ sdl_t *sp; ulong *val = (ulong *)arg; ensure( q , return(-EFAULT) ); sp = (sdl_t *)q->q_ptr; ensure( sp , return(-EFAULT) ); ensure( arg, return(-EFAULT) ); switch ( *val ) { case DEV_CLOCK_NONE: case DEV_CLOCK_ABR: case DEV_CLOCK_SHAPER: case DEV_CLOCK_TICK: sp->dev_conf.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){ sdl_t *sp; ulong *val = (ulong *)arg; ensure( q , return(-EFAULT) ); sp = (sdl_t *)q->q_ptr; ensure( sp , return(-EFAULT) ); ensure( arg, return(-EFAULT) ); *val = sp->dev_conf.ifclock; return(0);}/* * DEV_IOCCDISCTX * --------------------------------------------- * Disconnect the transmit path. */static intdev_ioccdisctx(queue_t *q, int cmd, void *arg){ ensure( q , return(-EFAULT) ); ensure( arg, return(-EFAULT) ); return(-EOPNOTSUPP);}/* * DEV_IOCCCONNTX * --------------------------------------------- * Reconnect the transmit path. */static intdev_ioccconntx(queue_t *q, int cmd, void *arg){ ensure( q , return(-EFAULT) ); ensure( arg, return(-EFAULT) ); return(-EOPNOTSUPP);}/* * ========================================================================= * * STREAMS Message Handling * * ========================================================================= * ------------------------------------------------------------------------- * * M_PROTO, M_PCPROTO Handling * * ------------------------------------------------------------------------- */static intsdl_w_proto(queue_t *q, mblk_t *mp){ int rtn; ulong prim; sdl_t *sp; ulong oldstate; ensure( q, return(-EFAULT) ); sp = (sdl_t *)q->q_ptr; oldstate = sp->state; ensure( sp, return(-EFAULT) ); ensure( mp, return(-EFAULT) ); switch ( (prim = *((ulong *)mp->b_rptr)) ) { case LMI_INFO_REQ: rtn = lmi_info_req (sp, mp); break; case LMI_ATTACH_REQ: rtn = lmi_attach_req (sp, mp); break; case LMI_DETACH_REQ: rtn = lmi_detach_req (sp, mp); break; case LMI_ENABLE_REQ: rtn = lmi_enable_req (sp, mp); break; case LMI_DISABLE_REQ: rtn = lmi_disable_req (sp, mp); break; case LMI_OPTMGMT_REQ: rtn = lmi_optmgmt_req (sp, mp); break; case SDL_DAEDT_TRANSMISSION_REQ: rtn = sdl_daedt_xmit_req (sp, mp); break; case SDL_DAEDT_START_REQ: rtn = sdl_daedt_start_req (sp, mp); break; case SDL_DAEDR_START_REQ: rtn = sdl_daedr_start_req (sp, mp); break; default: rtn = -EOPNOTSUPP; break; } if ( rtn < 0 ) { seldom(); sp->state = oldstate; } return(rtn);}static intsdl_r_proto(queue_t *q, mblk_t *mp){ int rtn; ulong prim; sdl_t *sp; ensure( q, return(-EFAULT) ); sp = (sdl_t *)q->q_ptr; ensure( sp, return(-EFAULT) ); ensure( mp, return(-EFAULT) ); switch ( (prim = *((ulong *)mp->b_rptr)) ) { case N_CONN_IND: rtn = n_conn_ind (sp, mp); break; case N_CONN_RES: rtn = n_conn_con (sp, mp); break; case N_DISCON_IND: rtn = n_discon_ind (sp, mp); break; case N_DATA_IND: rtn = n_data_ind (sp, mp); break; case N_EXDATA_IND: rtn = n_exdata_ind (sp, mp); break; case N_DATACK_IND: rtn = n_datack_ind (sp, mp); break; case N_INFO_ACK: rtn = n_info_ack (sp, mp); break; case N_BIND_ACK: rtn = n_bind_ack (sp, mp); break; case N_OK_ACK: rtn = n_ok_ack (sp, mp); break; case N_ERROR_ACK: rtn = n_error_ack (sp, mp); break; case N_RESET_IND: rtn = n_reset_ind (sp, mp); break; case N_RESET_CON: rtn = n_reset_con (sp, mp); break; default: rtn = -EOPNOTSUPP; break; } if ( rtn < 0 ) { seldom(); } return(rtn);}/* * ------------------------------------------------------------------------- * * M_DATA Handling * * ------------------------------------------------------------------------- */static intsdl_w_data(queue_t *q, mblk_t *mp){ int err; sdl_t *sp; ensure( q, return(-EFAULT) ); sp = (sdl_t *)q->q_ptr; ensure( sp, return(-EFAULT) ); ensure( mp, return(-EFAULT) ); if ( (err = sdl_write(sp, mp)) ) return err; return(1); /* absorbed mblk */}static intsdl_r_data(queue_t *q, mblk_t *mp){ int err; sdl_t *sp; ensure( q, return(-EFAULT) ); sp = (sdl_t *)q->q_ptr; ensure( sp, return(-EFAULT) ); ensure( mp, return(-EFAULT) ); if ( (err = sdl_read(sp, mp)) ) return err; return(1); /* absorbed mblk */}/* * ------------------------------------------------------------------------- * * M_CTL Handling (Events) * * ------------------------------------------------------------------------- */#if 0static intsdl_r_ctl(queue_t *q, mblk_t *mp){ sdl_t *sp; ensure( q, return(-EFAULT) ); sp = (sdl_t *)q->q_ptr; ensure( sp, return(-EFAULT) ); ensure( mp, return(-EFAULT) ); switch ( *mp->b_rptr ) { case SDL_EVENT_TX_WAKEUP: sdl_tx_wakeup(sp); return(0); } return(-EOPNOTSUPP);}#endif/* * ------------------------------------------------------------------------- * * M_IOCTL Handling * * ------------------------------------------------------------------------- */static intsdl_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; ensure( q, return(-EFAULT) ); ensure( mp, return(-EFAULT) ); switch ( type ) { case __SID: switch ( cmd ) { default: ptrace(("Unknown IOCTL %x\n",cmd)); case I_STR: case I_LINK: case I_PLINK: case I_UNLINK: case I_PUNLINK: rare(); (void)lp; ret = -EINVAL; break; } ret = -EOPNOTSUPP; break; case SDL_IOC_MAGIC: if ( count >= size ) { switch ( cmd ) { case SDL_IOCGOPTIONS: ret = sdl_iocgoptions(q, cmd, arg); break; case SDL_IOCSOPTIONS: ret = sdl_iocsoptions(q, cmd, arg); break; case SDL_IOCGCONFIG: ret = sdl_iocgconfig (q, cmd, arg); break; case SDL_IOCSCONFIG: ret = sdl_iocsconfig (q, cmd, arg); break; default: case SDL_IOCTCONFIG: case SDL_IOCCCONFIG: case SDL_IOCGSTATEM: case SDL_IOCCMRESET: case SDL_IOCGSTATSP: case SDL_IOCSSTATSP: case SDL_IOCGSTATS: case SDL_IOCCSTATS: case SDL_IOCGNOTIFY: case SDL_IOCSNOTIFY: case SDL_IOCCNOTIFY: ret = -EOPNOTSUPP; break; } } else ret = -EINVAL; break; case DEV_IOC_MAGIC: if ( count >= size ) { switch ( cmd ) { case DEV_IOCSIFCLOCK: ret = dev_iocsifclock(q, cmd, arg); break; case DEV_IOCGIFCLOCK: ret = dev_iocgifclock(q, cmd, arg); break; case DEV_IOCCDISCTX: ret = dev_ioccdisctx (q, cmd, arg); break; case DEV_IOCCCONNTX: ret = dev_ioccconntx (q, cmd, arg); break; default: case DEV_IOCCIFRESET: case DEV_IOCGIFFLAGS: case DEV_IOCSIFFLAGS: case DEV_IOCGIFTYPE: case DEV_IOCSIFTYPE: case DEV_IOCGGRPTYPE: case DEV_IOCSGRPTYPE: case DEV_IOCGIFMODE: case DEV_IOCSIFMODE: case DEV_IOCGIFRATE: case DEV_IOCSIFRATE: case DEV_IOCGIFCODING: case DEV_IOCSIFCODING: case DEV_IOCGIFLEADS: case DEV_IOCSIFLEADS:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -