📄 test-sctp_n.c
字号:
case N_EXDATA_REQ: printf(" | |<---(%03lu:%03lu)----|<----- N_EXDATA_REQ \n", qos_data.sid, qos_data.ssn); break; case N_EXDATA_IND: printf(" | [%010lu] |----(%03lu:%03lu)--->|-----> N_EXDATA_IND \n", (ulong)((N_qos_sel_data_sctp_t *)(cmd.cbuf+sizeof(cmd.npi.exdata_ind)))->tsn, (ulong)((N_qos_sel_data_sctp_t *)(cmd.cbuf+sizeof(cmd.npi.exdata_ind)))->sid, (ulong)((N_qos_sel_data_sctp_t *)(cmd.cbuf+sizeof(cmd.npi.exdata_ind)))->ssn); tsn[fd] = ((N_qos_sel_data_sctp_t *)(cmd.cbuf+sizeof(cmd.npi.exdata_ind)))->tsn; sid[fd] = ((N_qos_sel_data_sctp_t *)(cmd.cbuf+sizeof(cmd.npi.exdata_ind)))->sid; break; case N_DATACK_REQ: printf(" | |<---(%03lu:%03lu)----|<----- N_DATACK_REQ \n", qos_data.sid, qos_data.ssn); break; case N_DATACK_IND: printf(" | [%010lu] |----(%03lu:%03lu)--->|-----> N_DATACK_IND \n", (ulong)((N_qos_sel_data_sctp_t *)(cmd.cbuf+sizeof(cmd.npi.datack_ind)))->tsn, (ulong)((N_qos_sel_data_sctp_t *)(cmd.cbuf+sizeof(cmd.npi.datack_ind)))->sid, (ulong)((N_qos_sel_data_sctp_t *)(cmd.cbuf+sizeof(cmd.npi.datack_ind)))->ssn); tsn[fd] = ((N_qos_sel_data_sctp_t *)(cmd.cbuf+sizeof(cmd.npi.datack_ind)))->tsn; sid[fd] = ((N_qos_sel_data_sctp_t *)(cmd.cbuf+sizeof(cmd.npi.datack_ind)))->sid; break; case N_DISCON_REQ: printf(" | |<----------------|<----- N_DISCON_REQ \n"); break; case N_DISCON_IND: printf(" | |---------------->|-----> N_DISCON_IND \n"); break; case N_RESET_REQ: printf(" | |<----------------|<----- N_RESET_REQ \n"); break; case N_RESET_IND: printf(" | |---------------->|-----> N_RESET_IND \n"); break; case N_RESET_RES: printf(" | |<----------------|<----- N_RESET_RES \n"); break; case N_RESET_CON: printf(" | |---------------->|-----> N_RESET_CON \n"); break; default: printf(" | | |?----? ????%4ld???? \n", cmd.npi.type); break; } } break; } } FFLUSH(stdout);}void print_less(int fd){ switch ( show ) { case 1: switch ( fd ) { case 0: printf(" . . <---->| . |<----> . . \n"); printf(" . (more) . <---->| . |<----> . (more) . \n"); printf(" . . <---->| . |<----> . . \n"); break; case 3: printf(" . . <---->| . | | \n"); printf(" . (more) . <---->| . | | \n"); printf(" . . <---->| . | | \n"); break; case 4: printf(" | . |<-+-----> . . \n"); printf(" | . |<-+-----> . (more) . \n"); printf(" | . |<-+-----> . . \n"); break; case 5: printf(" | . | |<----> . . \n"); printf(" | . | |<----> . (more) . \n"); printf(" | . | |<----> . . \n"); break; } break; case 2: printf("%d-(more) ...\n", fd); break; } show = 0; return;}void print_more(void){ show = 1;}int get_msg(int fd, int wait){ int ret; int flags = 0; while ( (ret = getmsg(fd, &ctrl, &data, &flags)) < 0 ) { switch ( errno ) { default: case EPROTO: case EINVAL: printf("ERROR: getmsg: [%d] %s\n", errno, strerror(errno)); exit(2); case EINTR: case ERESTART: continue; case EAGAIN: break; } break; } if ( !ret ) { gettimeofday(&when,NULL); if ( show ) print_msg(fd); return(cmd.npi.type); } if ( !wait ) { /* printf("Nothing to get on getmsg\n"); */ return(FAILURE); } do { struct pollfd pfd[] = { { fd, POLLIN|POLLPRI, 0 } }; if ( !(ret = poll(pfd, 1, wait)) ) { /* printf("Timeout on poll for getmsg\n"); */ return(FAILURE); } if ( ret == 1 || ret == 2 ) { if ( pfd[0].revents & (POLLIN|POLLPRI) ) { flags = 0; if ( getmsg(fd, &ctrl, &data, &flags) == 0 ) { gettimeofday(&when,NULL); if ( show ) print_msg(fd); return(cmd.prim); } printf("ERROR: getmsg: [%d] %s\n", errno, strerror(errno)); return(FAILURE); } } if ( ret == -1 ) { printf("ERROR: poll: [%d] %s\n", errno, strerror(errno)); return(FAILURE); } } while(1);}int expect(int fd, int wait, int want){ int got; if ( (got = get_msg(fd, wait)) == want ) return(SUCCESS); else { switch ( show ) { case 1: switch ( fd ) { case 3: printf("(%-12s)<-????X[Expected] X X \n", prim_string(want)); break; case 4: printf(" X [Expected]X--X????->(%-12s)\n", prim_string(want)); break; case 5: printf(" X [Expected]X X????->(%-12s)\n", prim_string(want)); break; } break; case 2: printf("%d-ERROR: Expected ", fd); print_prim(want); printf(" got "); print_prim(got); printf("\n"); break; } return(FAILURE); }}int put_msg(int fd, int band, int flags, int wait){ int ret; struct strbuf *mydata = data.len ? &data : NULL; while ( (ret = putpmsg(fd, &ctrl, mydata, band, flags)) < 0 ) { switch ( errno ) { default: printf("ERROR: putpmsg: [%d] %s\n", errno, strerror(errno)); exit(2); break; case EINTR: case ERESTART: continue; case EAGAIN: break; } break; } if ( !ret ) { gettimeofday(&when,NULL); if ( show ) print_msg(fd); return(SUCCESS); } if ( !wait ) { /* printf("Nothing put on putpmsg\n"); */ return(FAILURE); } do { int flag = band?POLLWRNORM|POLLOUT:POLLWRBAND; struct pollfd pfd[] = { { fd, flag, 0 } }; if ( !(ret = poll(pfd, 1, wait)) ) { /* printf("Timeout on poll for putpmsg\n"); */ return(FAILURE); } if ( ret == 1 || ret == 2 ) { if ( pfd[0].revents & (POLLOUT|POLLWRNORM|POLLWRBAND) ) { if ( putpmsg(fd, &ctrl, mydata, band, flags) == 0 ) { gettimeofday(&when,NULL); if ( show ) print_msg(fd); return(SUCCESS); } printf("ERROR: putpmsg: [%d] %s\n", errno, strerror(errno)); return(FAILURE); } } if ( ret == -1 ) { printf("ERROR: poll: [%d] %s\n", errno, strerror(errno)); return(FAILURE); } } while(1);}int sctp_n_open(void){ int fd; if ( (fd = open("/dev/sctp_n",O_NONBLOCK|O_RDWR)) < 0 ) printf("ERROR: open: [%d] %s\n", errno, strerror(errno)); else switch ( show ) { case 1: switch ( fd ) { case 3: printf("OPEN ----->v \n"); break; case 4: printf(" | v<-------- OPEN \n"); break; case 5: printf(" | | v<----- OPEN \n"); break; } break; case 2: printf("\n%d-OPEN: sctp_n\n", fd); break; } return(fd);}int sctp_close(int fd){ int ret; if ( (ret = close(fd)) < 0 ) printf("ERROR: close: [%d] %s\n", errno, strerror(errno)); else switch ( show ) { case 1: switch ( fd ) { case 3: printf("CLOSE ----->X | | \n"); break; case 4: printf(" X<-+------ CLOSE \n"); break; case 5: printf(" X<----- CLOSE \n"); break; } break; case 2: printf("\n%d-CLOSE:\n",fd); break; } return(ret);}int sctp_info_req(int fd){ data.len = 0; ctrl.len = sizeof(cmd.npi.info_req); cmd.prim = N_INFO_REQ; return put_msg(fd, 0, MSG_HIPRI, 0);}int sctp_optmgmt_req(int fd, ulong flags){ data.len = 0; ctrl.len = sizeof(cmd.npi.optmgmt_req)+sizeof(qos_info); cmd.prim = N_OPTMGMT_REQ; cmd.npi.optmgmt_req.OPTMGMT_flags = flags; cmd.npi.optmgmt_req.QOS_length = sizeof(qos_info); cmd.npi.optmgmt_req.QOS_offset = sizeof(cmd.npi.optmgmt_req); bcopy(&qos_info, (cmd.cbuf + sizeof(cmd.npi.optmgmt_req)), sizeof(qos_info)); return put_msg(fd, 0, MSG_BAND, 0);}int sctp_bind_req(int fd, addr_t *addr, int coninds){ data.len = 0; ctrl.len = sizeof(cmd.npi.bind_req)+sizeof(*addr); cmd.prim = N_BIND_REQ; cmd.npi.bind_req.ADDR_length = sizeof(*addr); cmd.npi.bind_req.ADDR_offset = sizeof(cmd.npi.bind_req); cmd.npi.bind_req.CONIND_number = coninds; cmd.npi.bind_req.BIND_flags = TOKEN_REQUEST; cmd.npi.bind_req.PROTOID_length = 0; cmd.npi.bind_req.PROTOID_offset = 0; bcopy(addr, (&cmd.npi.bind_req)+1, sizeof(*addr)); return put_msg(fd, 0, MSG_BAND, 0);}int sctp_unbind_req(int fd){ data.len = 0; ctrl.len = sizeof(cmd.npi.unbind_req); cmd.prim = N_UNBIND_REQ; return put_msg(fd, 0, MSG_BAND, 0);}int sctp_conn_req(int fd, addr_t *addr, const char *dat){ if ( !dat ) data.len = 0; else { data.len = strlen(dat)+1; strncpy(dbuf, dat, BUFSIZE); } ctrl.len = sizeof(cmd.npi.conn_req)+sizeof(*addr)+sizeof(qos_conn); cmd.prim = N_CONN_REQ; cmd.npi.conn_req.DEST_length = sizeof(*addr); cmd.npi.conn_req.DEST_offset = sizeof(cmd.npi.conn_req); cmd.npi.conn_req.CONN_flags = REC_CONF_OPT|EX_DATA_OPT; cmd.npi.conn_req.QOS_length = sizeof(qos_conn); cmd.npi.conn_req.QOS_offset = sizeof(cmd.npi.conn_req)+sizeof(*addr); bcopy(addr, (cmd.cbuf + sizeof(cmd.npi.conn_req)), sizeof(*addr)); bcopy(&qos_conn, (cmd.cbuf + sizeof(cmd.npi.conn_req)+sizeof(*addr)), sizeof(qos_conn)); return put_msg(fd, 0, MSG_BAND, 0);}int sctp_conn_res(int fd, int fd2, const char *dat){ if ( !dat ) data.len = 0; else { data.len = strlen(dat)+1; strncpy(dbuf, dat, BUFSIZE); } ctrl.len = sizeof(cmd.npi.conn_res); cmd.prim = N_CONN_RES; cmd.npi.conn_res.TOKEN_value = tok[fd2]; cmd.npi.conn_res.RES_offset = 0; cmd.npi.conn_res.RES_length = 0; cmd.npi.conn_res.SEQ_number = seq[fd]; cmd.npi.conn_res.CONN_flags = REC_CONF_OPT|EX_DATA_OPT; cmd.npi.conn_res.QOS_offset = 0; cmd.npi.conn_res.QOS_length = 0; return put_msg(fd, 0, MSG_BAND, 0);}int sctp_discon_req(int fd, ulong seq){ data.len = 0; ctrl.len = sizeof(cmd.npi.discon_req); cmd.prim = N_DISCON_REQ; cmd.npi.discon_req.DISCON_reason = 0; cmd.npi.discon_req.RES_length = 0; cmd.npi.discon_req.RES_offset = 0; cmd.npi.discon_req.SEQ_number = seq; return put_msg(fd, 0, MSG_BAND, 0);}int sctp_data_req(int fd, ulong flags, const char *dat, int wait){ if ( !dat ) return(FAILURE); else { data.len = strlen(dat)+1; strncpy(dbuf, dat, BUFSIZE); } ctrl.len = sizeof(cmd.npi.data_req)+sizeof(qos_data); cmd.prim = N_DATA_REQ; cmd.npi.data_req.DATA_xfer_flags = flags; bcopy(&qos_data, cmd.cbuf + sizeof(cmd.npi.data_req), sizeof(qos_data)); return put_msg(fd, 0, MSG_BAND, wait);}int sctp_ndata_req(int fd, ulong flags, const char *dat, size_t len, int wait){ int ret; if ( !dat ) return(FAILURE); else { data.maxlen = len; data.len = len; data.buf = (char *)dat; } ctrl.len = sizeof(cmd.npi.data_req)+sizeof(qos_data); cmd.prim = N_DATA_REQ; cmd.npi.data_req.DATA_xfer_flags = flags; bcopy(&qos_data, cmd.cbuf + sizeof(cmd.npi.data_req), sizeof(qos_data)); ret = put_msg(fd, 0, MSG_BAND, wait); data.maxlen = BUFSIZE; data.len = 0; data.buf = dbuf; return(ret);}int sctp_exdata_req(int fd, const char *dat){ if ( !dat ) return(FAILURE); else { data.len = strlen(dat)+1; strncpy(dbuf, dat, BUFSIZE); } ctrl.len = sizeof(cmd.npi.exdata_req)+sizeof(qos_data); cmd.prim = N_EXDATA_REQ; bcopy(&qos_data, cmd.cbuf + sizeof(cmd.npi.exdata_req), sizeof(qos_data)); return put_msg(fd, 1, MSG_BAND, 0);}int sctp_datack_req(int fd, ulong tsn){ int ret; data.len = 0; ctrl.len = sizeof(cmd.npi.datack_req)+sizeof(qos_data); cmd.prim = N_DATACK_REQ; qos_data.tsn = tsn; bcopy(&qos_data, cmd.cbuf + sizeof(cmd.npi.datack_req), sizeof(qos_data)); ret = put_msg(fd, 0, MSG_BAND, 0); qos_data.tsn = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -