📄 spm.c
字号:
{ mblk_t *mp; lmi_disable_con_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_CON; p->lmi_state = state; qreply(q, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}/* * LMI_OPTMGMT_ACK * ----------------------------------- */#if 0STATIC INLINE intlmi_optmgmt_ack(queue_t *q, ulong flags, caddr_t opt_ptr, size_t opt_len){ mblk_t *mp; lmi_optmgmt_ack_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)++; p->lmi_primitive = LMI_OPTMGMT_ACK; p->lmi_opt_length = opt_len; p->lmi_opt_offset = opt_len ? sizeof(*p) : 0; p->lmi_flags = flags; bcopy(opt_ptr, mp->b_wptr, opt_len); mp->b_wptr += opt_len; qreply(q, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}/* * LMI_ERROR_IND * ----------------------------------- */STATIC INLINE intlmi_error_ind(queue_t *q, long state, long error, long reason){ mblk_t *mp; lmi_error_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->lmi_primitive = LMI_ERROR_IND; p->lmi_errno = error; p->lmi_reason = reason; p->lmi_state = state; qreply(q, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}/* * LMI_STATS_IND * ----------------------------------- */STATIC INLINE intlmi_stats_ind(queue_t *q){ mblk_t *mp; lmi_stats_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->lmi_primitive = LMI_STATS_IND; p->lmi_interval = 0; p->lmi_timestamp = jiffies; qreply(q, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}/* * LMI_EVENT_IND * ----------------------------------- */STATIC INLINE intlmi_event_ind(queue_t *q, 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_PCPROTO; 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; qreply(q, mp); return (QR_DONE); } rare(); return (-ENOBUFS);}#endif/* * ======================================================================== * * EVENTS from above or below * * ======================================================================== * * MESSAGES from above or below * * ------------------------------------------------------------------------- *//* * SDL_BITS_FOR_TRANSMISSION_REQ * ----------------------------------- */STATIC INLINE intsdl_bits_for_transmission_req(queue_t *q, mblk_t *mp){ (void) q; (void) mp; /* strip to M_DATA */ return (QR_STRIP);}/* * SDL_CONNECT_REQ * ----------------------------------- */STATIC INLINE intsdl_connect_req(queue_t *q, mblk_t *mp){ (void) q; (void) mp; /* ignore */ return (QR_DONE);}/* * SDL_DISCONNECT_REQ * ----------------------------------- */STATIC INLINE intsdl_disconnect_req(queue_t *q, mblk_t *mp){ /* translated to indication */ return sdl_disconnect_ind(q, mp);}/* * LMI_INFO_REQ * ----------------------------------- */STATIC INLINE intlmi_info_req(queue_t *q, mblk_t *mp){ (void) mp; return lmi_info_ack(q, 0, NULL, 0);}/* * LMI_ATTACH_REQ * ----------------------------------- */STATIC INLINE intlmi_attach_req(queue_t *q, mblk_t *mp){ (void) mp; return lmi_ok_ack(q, LMI_DISABLED, LMI_ATTACH_REQ);}/* * LMI_DETACH_REQ * ----------------------------------- */STATIC INLINE intlmi_detach_req(queue_t *q, mblk_t *mp){ (void) mp; return lmi_ok_ack(q, LMI_UNATTACHED, LMI_DETACH_REQ);}/* * LMI_ENABLE_REQ * ----------------------------------- */STATIC INLINE intlmi_enable_req(queue_t *q, mblk_t *mp){ (void) mp; return lmi_enable_con(q, LMI_ENABLED);}/* * LMI_DISABLE_REQ * ----------------------------------- */STATIC INLINE intlmi_disable_req(queue_t *q, mblk_t *mp){ (void) mp; return lmi_disable_con(q, LMI_DISABLED);}/* * LMI_OPTMGMT_REQ * ----------------------------------- */STATIC INLINE intlmi_optmgmt_req(queue_t *q, mblk_t *mp){ (void) mp; return lmi_error_ack(q, 0, LMI_OPTMGMT_REQ, EOPNOTSUPP, 0);}/* * ------------------------------------------------------------------------- * * IO CONTROLS from above or below * * ------------------------------------------------------------------------- *//* * SDL_IOCGOPTIONS * ----------------------------------- */STATIC intsdl_iocgoptions(queue_t *q, mblk_t *mp){ spm_t *s = PRIV(q); void *arg = mp->b_cont ? mp->b_cont->b_rptr : NULL; *(lmi_option_t *) arg = s->option; return (0);}/* * SDL_IOCSOPTIONS * ----------------------------------- */STATIC intsdl_iocsoptions(queue_t *q, mblk_t *mp){ spm_t *s = PRIV(q); void *arg = mp->b_cont ? mp->b_cont->b_rptr : NULL; s->option = *(lmi_option_t *) arg; return (0);}/* * SDL_IOCGCONFIG * ----------------------------------- */STATIC intsdl_iocgconfig(queue_t *q, mblk_t *mp){ spm_t *s = PRIV(q); void *arg = mp->b_cont ? mp->b_cont->b_rptr : NULL; *(sdl_config_t *) arg = s->config; return (0);}/* * SDL_IOCSCONFIG * ----------------------------------- */STATIC intsdl_iocsconfig(queue_t *q, mblk_t *mp){ spm_t *s = PRIV(q); void *arg = mp->b_cont ? mp->b_cont->b_rptr : NULL; s->config = *(sdl_config_t *) arg; return (0);}/* * SDL_IOCTCONFIG * ----------------------------------- */STATIC intsdl_ioctconfig(queue_t *q, mblk_t *mp){ spm_t *s = PRIV(q); void *arg = mp->b_cont ? mp->b_cont->b_rptr : NULL; (void) s; (void) arg; fixme(("Test the configuration\n")); return (-EOPNOTSUPP);}/* * SDL_IOCCCONFIG * ----------------------------------- */STATIC intsdl_ioccconfig(queue_t *q, mblk_t *mp){ spm_t *s = PRIV(q); void *arg = mp->b_cont ? mp->b_cont->b_rptr : NULL; (void) s; (void) arg; fixme(("Commit the configuration\n")); return (-EOPNOTSUPP);}/* * SDL_IOCGSTATEM * ----------------------------------- */STATIC intsdl_iocgstatem(queue_t *q, mblk_t *mp){ spm_t *s = PRIV(q); void *arg = mp->b_cont ? mp->b_cont->b_rptr : NULL; *(sdl_statem_t *) arg = s->statem; return (0);}/* * SDL_IOCCMRESET * ----------------------------------- */STATIC intsdl_ioccmreset(queue_t *q, mblk_t *mp){ spm_t *s = PRIV(q); void *arg = mp->b_cont ? mp->b_cont->b_rptr : NULL; (void) s; (void) arg; fixme(("Master reset\n")); return (-EOPNOTSUPP);}/* * SDL_IOCGSTATSP * ----------------------------------- */STATIC intsdl_iocgstatsp(queue_t *q, mblk_t *mp){ spm_t *s = PRIV(q); void *arg = mp->b_cont ? mp->b_cont->b_rptr : NULL; *(sdl_stats_t *) arg = s->statsp; return (0);}/* * SDL_IOCSSTATSP * ----------------------------------- */STATIC intsdl_iocsstatsp(queue_t *q, mblk_t *mp){ spm_t *s = PRIV(q); void *arg = mp->b_cont ? mp->b_cont->b_rptr : NULL; s->statsp = *(sdl_stats_t *) arg; return (0);}/* * SDL_IOCGSTATS * ----------------------------------- */STATIC intsdl_iocgstats(queue_t *q, mblk_t *mp){ spm_t *s = PRIV(q); void *arg = mp->b_cont ? mp->b_cont->b_rptr : NULL; *(sdl_stats_t *) arg = s->stats; return (0);}/* * SDL_IOCCSTATS * ----------------------------------- */STATIC intsdl_ioccstats(queue_t *q, mblk_t *mp){ spm_t *s = PRIV(q); void *arg = mp->b_cont ? mp->b_cont->b_rptr : NULL; (void) arg; bzero(&s->stats, sizeof(s->stats)); return (0);}/* * SDL_IOCGNOTIFY * ----------------------------------- */STATIC intsdl_iocgnotify(queue_t *q, mblk_t *mp){ spm_t *s = PRIV(q); void *arg = mp->b_cont ? mp->b_cont->b_rptr : NULL; *(sdl_notify_t *) arg = s->notify; return (0);}/* * SDL_IOCSNOTIFY * ----------------------------------- */STATIC intsdl_iocsnotify(queue_t *q, mblk_t *mp){ spm_t *s = PRIV(q); void *arg = mp->b_cont ? mp->b_cont->b_rptr : NULL; s->notify = *(sdl_notify_t *) arg; return (0);}/* * SDL_IOCCNOTIFY * ----------------------------------- */STATIC intsdl_ioccnotify(queue_t *q, mblk_t *mp){ spm_t *s = PRIV(q); void *arg = mp->b_cont ? mp->b_cont->b_rptr : NULL; s->notify.events &= ~((sdl_notify_t *) arg)->events; return (0);}/* * ======================================================================== * * STREAMS Message Handling * * ======================================================================== * * M_IOCTL Handling * ----------------------------------------------------------------------- */STATIC intspm_m_ioctl(queue_t *q, mblk_t *mp){ int ret; struct iocblk *iocp = (struct iocblk *) mp->b_rptr; int cmd = iocp->ioc_cmd, count = iocp->ioc_count; int type = _IOC_TYPE(cmd), nr = _IOC_NR(cmd), size = _IOC_SIZE(cmd); (void) nr; switch (type) { case __SID: { switch (cmd) { default: ptrace(("spm: ERROR: Unknown IOCTL %d\n", cmd)); ret = -EINVAL; break; case I_STR: case I_LINK: case I_PLINK: case I_UNLINK: case I_PUNLINK: { void *arg = mp->b_cont ? mp->b_cont->b_rptr : NULL; struct linkblk *lp = (struct linkblk *) arg; rare(); (void) lp; ret = -EINVAL; break; } } ret = -EFAULT; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -