📄 m2pa_slm.c
字号:
p->lmi_severity = severity; bcopy(mp->b_wptr, inf_ptr, inf_len); mp->b_wptr += inf_len; putnext(sl->rq, mp); return(0); } rare(); return(-ENOBUFS); } seldom(); return(-EBUSY);}/* * SL_PDU_IND * --------------------------------------------- */static intsl_pdu_ind(sl_t *sl, mblk_t *dp){ mblk_t *mp; sl_pdu_ind_t *p; if ( canputnext(sl->rq) ) { if ( (mp = allocb(sizeof(*p), BPRI_MED)) ) { mp->b_datap->db_type = M_PROTO; p = ((sl_pdu_ind_t *)mp->b_wptr)++; p->sl_primitive = SL_PDU_IND; mp->b_cont = dp; ptrace(("Delivering mp = %u\n",(uint)mp)); putnext(sl->rq, mp); return(0); } rare(); return(-ENOBUFS); } seldom(); return(-EBUSY);}/* * SL_LINK_CONGESTED_IND * --------------------------------------------- */static intsl_link_congested_ind(sl_t *sl, ulong cong, ulong disc){ mblk_t *mp; sl_link_cong_ind_t *p; if ( canputnext(sl->rq) ) { if ( (mp = allocb(sizeof(*p), BPRI_MED)) ) { mp->b_datap->db_type = M_PROTO; p = ((sl_link_cong_ind_t *)mp->b_wptr)++; p->sl_primitive = SL_LINK_CONGESTED_IND; p->sl_timestamp = jiffies; p->sl_cong_status = cong; p->sl_disc_status = disc; putnext(sl->rq, mp); return(0); } rare(); return(-ENOBUFS); } seldom(); return(-EBUSY);}/* * SL_LINK_CONGESTION_CEASED_IND * --------------------------------------------- */static intsl_link_congestion_ceased_ind(sl_t *sl, ulong cong, ulong disc){ mblk_t *mp; sl_link_cong_ceased_ind_t *p; if ( canputnext(sl->rq) ) { if ( (mp = allocb(sizeof(*p), BPRI_MED)) ) { mp->b_datap->db_type = M_PROTO; p = ((sl_link_cong_ceased_ind_t *)mp->b_wptr)++; p->sl_primitive = SL_LINK_CONGESTION_CEASED_IND; p->sl_timestamp = jiffies; p->sl_cong_status = cong; p->sl_disc_status = disc; putnext(sl->rq, mp); return(0); } rare(); return(-ENOBUFS); } seldom(); return(-EBUSY);}/* * SL_RETRIEVED_MESSAGE_IND * --------------------------------------------- */static intsl_retrieved_message_ind(sl_t *sl, mblk_t *dp){ mblk_t *mp; sl_retrieved_msg_ind_t *p; if ( canputnext(sl->rq) ) { if ( (mp = allocb(sizeof(*p), BPRI_MED)) ) { mp->b_datap->db_type = M_PROTO; p = ((sl_retrieved_msg_ind_t *)mp->b_wptr)++; p->sl_primitive = SL_RETRIEVED_MESSAGE_IND; mp->b_cont = dp; putnext(sl->rq, mp); return(0); } rare(); return(-ENOBUFS); } seldom(); return(-EBUSY);}/* * SL_RETRIEVAL_COMPLETE_IND * --------------------------------------------- */static intsl_retrieval_complete_ind(sl_t *sl){ mblk_t *mp; sl_retrieval_comp_ind_t *p; if ( canputnext(sl->rq) ) { if ( (mp = allocb(sizeof(*p), BPRI_MED)) ) { mp->b_datap->db_type = M_PROTO; p = ((sl_retrieval_comp_ind_t *)mp->b_wptr)++; p->sl_primitive = SL_RETRIEVAL_COMPLETE_IND; putnext(sl->rq, mp); return(0); } rare(); return(-ENOBUFS); } seldom(); return(-EBUSY);}/* * SL_RB_CLEARED_IND * --------------------------------------------- */static intsl_rb_cleared_ind(sl_t *sl){ mblk_t *mp; sl_rb_cleared_ind_t *p; if ( canputnext(sl->rq) ) { if ( (mp = allocb(sizeof(*p), BPRI_MED)) ) { mp->b_datap->db_type = M_PROTO; p = ((sl_rb_cleared_ind_t *)mp->b_wptr)++; p->sl_primitive = SL_RB_CLEARED_IND; putnext(sl->rq, mp); return(0); } rare(); return(-ENOBUFS); } seldom(); return(-EBUSY);}/* * SL_BSNT_IND * --------------------------------------------- */static intsl_bsnt_ind(sl_t *sl, ulong bsnt){ mblk_t *mp; sl_bsnt_ind_t *p; if ( canputnext(sl->rq) ) { if ( (mp = allocb(sizeof(*p), BPRI_MED)) ) { mp->b_datap->db_type = M_PROTO; p = ((sl_bsnt_ind_t *)mp->b_wptr)++; p->sl_primitive = SL_BSNT_IND; p->sl_bsnt = bsnt; putnext(sl->rq, mp); return(0); } rare(); return(-ENOBUFS); } seldom(); return(-EBUSY);}/* * SL_IN_SERVICE_IND * --------------------------------------------- */static intsl_in_service_ind(sl_t *sl){ mblk_t *mp; sl_in_service_ind_t *p; if ( canputnext(sl->rq) ) { if ( (mp = allocb(sizeof(*p), BPRI_MED)) ) { mp->b_datap->db_type = M_PROTO; p = ((sl_in_service_ind_t *)mp->b_wptr)++; p->sl_primitive = SL_IN_SERVICE_IND; putnext(sl->rq, mp); return(0); } rare(); return(-ENOBUFS); } seldom(); return(-EBUSY);}/* * SL_OUT_OF_SERVICE_IND * --------------------------------------------- */static intsl_out_of_service_ind(sl_t *sl, ulong reason){ mblk_t *mp; sl_out_of_service_ind_t *p; if ( canputnext(sl->rq) ) { if ( (mp = allocb(sizeof(*p), BPRI_MED)) ) { mp->b_datap->db_type = M_PROTO; p = ((sl_out_of_service_ind_t *)mp->b_wptr)++; p->sl_primitive = SL_OUT_OF_SERVICE_IND; p->sl_timestamp = jiffies; p->sl_reason = reason; putnext(sl->rq, mp); return(0); } rare(); return(-ENOBUFS); } seldom(); return(-EBUSY);}/* * SL_REMOTE_PROCESSOR_OUTAGE_IND * --------------------------------------------- */static intsl_remote_processor_outage_ind(sl_t *sl){ mblk_t *mp; sl_rem_proc_out_ind_t *p; if ( canputnext(sl->rq) ) { if ( (mp = allocb(sizeof(*p), BPRI_MED)) ) { mp->b_datap->db_type = M_PROTO; p = ((sl_rem_proc_out_ind_t *)mp->b_wptr)++; p->sl_primitive = SL_REMOTE_PROCESSOR_OUTAGE_IND; p->sl_timestamp = jiffies; putnext(sl->rq, mp); return(0); } rare(); return(-ENOBUFS); } seldom(); return(-EBUSY);}/* * SL_REMOTE_PROCESSOR_RECOVERED_IND * --------------------------------------------- */static intsl_remote_processor_recovered_ind(sl_t *sl){ mblk_t *mp; sl_rem_proc_recovered_ind_t *p; if ( canputnext(sl->rq) ) { if ( (mp = allocb(sizeof(*p), BPRI_MED)) ) { mp->b_datap->db_type = M_PROTO; p = ((sl_rem_proc_recovered_ind_t *)mp->b_wptr)++; p->sl_primitive = SL_REMOTE_PROCESSOR_RECOVERED_IND; p->sl_timestamp = jiffies; putnext(sl->rq, mp); return(0); } rare(); return(-ENOBUFS); } seldom(); return(-EBUSY);}/* * SL_RTB_CLEARED_IND * --------------------------------------------- */static intsl_rtb_cleared_ind(sl_t *sl){ mblk_t *mp; sl_rtb_cleared_ind_t *p; if ( canputnext(sl->rq) ) { if ( (mp = allocb(sizeof(*p), BPRI_MED)) ) { mp->b_datap->db_type = M_PROTO; p = ((sl_rtb_cleared_ind_t *)mp->b_wptr)++; p->sl_primitive = SL_RTB_CLEARED_IND; putnext(sl->rq, mp); return(0); } rare(); return(-ENOBUFS); } seldom(); return(-EBUSY);}/* * SL_RETRIEVAL_NOT_POSSIBLE_IND * --------------------------------------------- */static intsl_retrieval_not_possible_ind(sl_t *sl){ mblk_t *mp; sl_retrieval_not_poss_ind_t *p; if ( canputnext(sl->rq) ) { if ( (mp = allocb(sizeof(*p), BPRI_MED)) ) { mp->b_datap->db_type = M_PROTO; p = ((sl_retrieval_not_poss_ind_t *)mp->b_wptr)++; p->sl_primitive = SL_RETRIEVAL_NOT_POSSIBLE_IND; putnext(sl->rq, mp); return(0); } rare(); return(-ENOBUFS); } seldom(); return(-EBUSY);}/* * SL_BSNT_NOT_RETRIEVABLE_IND * --------------------------------------------- */static intsl_bsnt_not_retrievable_ind(sl_t *sl, ulong bsnt){ mblk_t *mp; sl_bsnt_not_retr_ind_t *p; if ( canputnext(sl->rq) ) { if ( (mp = allocb(sizeof(*p), BPRI_MED)) ) { mp->b_datap->db_type = M_PROTO; p = ((sl_bsnt_not_retr_ind_t *)mp->b_wptr)++; p->sl_primitive = SL_BSNT_NOT_RETRIEVABLE_IND; p->sl_bsnt = bsnt; putnext(sl->rq, mp); return(0); } rare(); return(-ENOBUFS); } seldom(); return(-EBUSY);}/* * ------------------------------------------------------------------------- * * NPI User (M2PA) -> NPI Provider (SCTP) Primitives * * ------------------------------------------------------------------------- * * N_DATA_REQ * --------------------------------------------- */static intn_data_req(sl_t *sl, ulong flags, void *qos_ptr, size_t qos_len, mblk_t *dp){ mblk_t *mp; N_data_req_t *p; if ( canputnext(sl->wq) ) { if ( (mp = allocb(sizeof(*p)+qos_len, BPRI_MED)) ) { mp->b_datap->db_type = M_PROTO; p = ((N_data_req_t *)mp->b_wptr)++; p->PRIM_type = N_DATA_REQ; p->DATA_xfer_flags = flags; bcopy(qos_ptr, mp->b_wptr, qos_len); mp->b_wptr += qos_len; mp->b_cont = dp; putnext(sl->wq, mp); return(0); } rare(); return(-ENOBUFS); } seldom(); return(-EBUSY);}/* * N_EXDATA_REQ * --------------------------------------------- */static intn_exdata_req(sl_t *sl, void *qos_ptr, size_t qos_len, mblk_t *dp){ mblk_t *mp; N_exdata_req_t *p; if ( bcanputnext(sl->wq, 1) ) { if ( (mp = allocb(sizeof(*p)+qos_len, BPRI_MED)) ) { mp->b_datap->db_type = M_PROTO; p = ((N_exdata_req_t *)mp->b_wptr)++; p->PRIM_type = N_EXDATA_REQ; bcopy(qos_ptr, mp->b_wptr, qos_len); mp->b_wptr += qos_len; mp->b_cont = dp; putnext(sl->wq, mp); return(0); } rare(); return(-ENOBUFS); } seldom(); return(-EBUSY);}/* * ------------------------------------------------------------------------- * * SL Peer (M2PA) -> SL Peer Sent Messages * * ------------------------------------------------------------------------- * * M2PA SEND PROVING * --------------------------------------------- */static intsl_send_proving(sl_t *sl, size_t plen){ int err; mblk_t *mp; N_qos_sel_data_sctp_t qos = { N_QOS_SEL_DATA_SCTP, M2PA_PPI, M2PA_DATA_STREAM, }; if ( (mp = allocb(2*sizeof(uint32_t)+plen, BPRI_MED)) ) { mp->b_datap->db_type = M_DATA; *((uint32_t *)mp->b_wptr)++ = M2PA_PROVING_MESSAGE; *((uint32_t *)mp->b_wptr)++ = __constant_htonl(2*sizeof(uint32_t)+plen); fixme(("We should include a test pattern.\n")); bzero(mp->b_wptr, plen); mp->b_wptr += plen; if ( !(err = n_data_req(sl, 0, &qos, sizeof(qos), mp)) ) return(0); freeb(mp); return(err); } return(-ENOBUFS);}/* * M2PA SEND STATUS * --------------------------------------------- */static intsl_send_status(sl_t *sl, uint32_t status){ int err; mblk_t *mp; N_qos_sel_data_sctp_t qos = { N_QOS_SEL_DATA_SCTP, M2PA_PPI, M2PA_STATUS_STREAM, }; if ( (mp = allocb(3*sizeof(uint32_t), BPRI_MED)) ) { mp->b_datap->db_type = M_DATA; *((uint32_t *)mp->b_wptr)++ = M2PA_STATUS_MESSAGE; *((uint32_t *)mp->b_wptr)++ = __constant_htonl(3*sizeof(uint32_t)); *((uint32_t *)mp->b_wptr)++ = status; if ( !(err = n_data_req(sl, 0, &qos, sizeof(qos), mp)) ) return(0); assert(mp->b_datap->db_ref); freeb(mp); return(err); } return(-ENOBUFS);}/* * M2PA SEND ACK * --------------------------------------------- */static intsl_send_ack(sl_t *sl, ulong count){ int err; mblk_t *mp; N_qos_sel_data_sctp_t qos = { N_QOS_SEL_DATA_SCTP, M2PA_PPI, M2PA_DATA_STREAM, }; if ( (mp = allocb(3*sizeof(uint32_t), BPRI_MED)) ) { mp->b_datap->db_type = M_DATA; *((uint32_t *)mp->b_wptr)++ = M2PA_ACK_MESSAGE; *((uint32_t *)mp->b_wptr)++ = __constant_htonl(3*sizeof(uint32_t)); *((uint32_t *)mp->b_wptr)++ = htonl(count); if ( (err = n_exdata_req(sl, &qos, sizeof(qos), mp)) ) { assert(mp->b_datap->db_ref); freeb(mp); return(err); } return(0); } return(-ENOBUFS);}/* * M2PA SEND DATA * --------------------------------------------- */static intsl_send_data(sl_t *sl, mblk_t *dp){ int err; mblk_t *mp, *db; ulong rcpt = sl->version<M2PA_VERSION_DRAFT4?N_RC_FLAG:0; size_t dlen = msgdsize(dp); N_qos_sel_data_sctp_t qos = { N_QOS_SEL_DATA_SCTP, M2PA_PPI, M2PA_DATA_STREAM, }; if ( !(db = dupmsg(dp)) ) return(-ENOBUFS); if ( (mp = allocb(2*sizeof(uint32_t), BPRI_MED)) ) { mp->b_datap->db_type = M_DATA; *((uint32_t *)mp->b_wptr)++ = M2PA_DATA_MESSAGE; *((uint32_t *)mp->b_wptr)++ = __constant_htonl(dlen + 2*sizeof(uint32_t)); mp->b_cont = db; pullupmsg(mp, -1); if ( (err = n_data_req(sl, rcpt, &qos, sizeof(qos), mp)) ) { assert(mp->b_datap->db_ref); freemsg(mp); return(err); } return(0); } freemsg(db); return(-ENOBUFS);}/* * ========================================================================= * * M2PA State Machines * * ========================================================================= */#define MF_LPO 0x00000001#define MF_RPO 0x00000002#define MF_LOC_INS 0x00000004#define MF_REM_INS 0x00000008#define MF_LOC_BUSY 0x00000010#define MF_REM_BUSY 0x00000020#define MF_LOC_EMERG 0x00000040#define MF_REM_EMERG 0x00000080#define MF_RECV_MSU 0x00000100#define MF_SEND_MSU 0x00000200#define MF_CONG_ACCEPT 0x00000400#define MF_CONG_DISCARD 0x00000800#define MF_RTB_FULL 0x00001000#define MF_L3_CONG_DETECT 0x00002000#define MF_L2_CONG_DETECT 0x00004000#define MF_CONTINUE 0x00008000#define MF_CLEAR_RTB 0x00010000#define MF_NEED_FLUSH 0x00020000#define MS_POWER_OFF 0#define MS_OUT_OF_SERVICE 1#define MS_NOT_ALIGNED 2#define MS_ALIGNED 3#define MS_PROVING 4#define MS_ALIGNED_NOT_READY 5#define MS_ALIGNED_READY 6#define MS_IN_SERVICE 7#define MS_PROCESSOR_OUTAGE 8/* * ------------------------------------------------------------------------- * * Timers *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -