📄 test-sctp_t.c
字号:
printf(" DATA = %s\n", dbuf); break; case T_EXDATA_REQ: printf(" MORE_flag = %lu\n", cmd.tpi.exdata_req.MORE_flag); printf(" DATA = %s\n", dbuf); break; case T_EXDATA_IND: printf(" MORE_flag = %lu\n", cmd.tpi.exdata_ind.MORE_flag); printf(" DATA = %s\n", dbuf); break; case T_OPTDATA_REQ: printf(" DATA_flag = "); if ( cmd.tpi.optdata_req.DATA_flag & T_ODF_MORE ) printf("T_ODF_MORE "); if ( cmd.tpi.optdata_req.DATA_flag & T_ODF_EX ) printf("T_ODF_EX "); printf("\n"); printf(" OPT = "); print_opt (cmd.cbuf + cmd.tpi.optdata_req.OPT_offset, cmd.tpi.optdata_req.OPT_length); printf(" DATA = %s\n", dbuf); break; case T_OPTDATA_IND: printf(" DATA_flag = "); if ( cmd.tpi.optdata_ind.DATA_flag & T_ODF_MORE ) printf("T_ODF_MORE "); if ( cmd.tpi.optdata_ind.DATA_flag & T_ODF_EX ) printf("T_ODF_EX "); printf("\n"); printf(" OPT = "); print_opt (cmd.cbuf + cmd.tpi.optdata_ind.OPT_offset, cmd.tpi.optdata_ind.OPT_length); printf(" DATA = %s\n", dbuf); tsn[fd] = ((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->tsn_val; sid[fd] = ((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->sid_val; break; case T_DISCON_REQ: printf(" SEQ_number = %lx\n", cmd.tpi.discon_req.SEQ_number); break; case T_DISCON_IND: { long reason = (long)cmd.tpi.discon_ind.DISCON_reason; if ( reason >= 0 ) printf(" DISCON_reason = %lu\n", (ulong)reason); else printf(" DISCON_reason = %ld (%s)\n", reason, strerror(-reason)); printf(" SEQ_number = %lx\n", cmd.tpi.discon_ind.SEQ_number); break; } case T_ORDREL_REQ: break; case T_ORDREL_IND: break; default: printf("Unrecognized primitive %lu!\n", cmd.tpi.type); break; } break; case 1: if ( fd == fd1 ) { switch ( cmd.tpi.type ) { case T_INFO_REQ: printf("T_INFO_REQ ----->| | | \n"); break; case T_INFO_ACK: printf("T_INFO_ACK <-----| | | \n"); break; case T_OPTMGMT_REQ: printf("T_OPTMGMT_REQ ----->| | | \n"); break; case T_OPTMGMT_ACK: printf("T_OPTMGMT_ACK <-----| | | \n"); break; case T_BIND_REQ: printf("T_BIND_REQ ----->| | | \n"); break; case T_BIND_ACK: printf("T_BIND_ACK <-----| | | \n"); break; case T_ADDR_REQ: printf("T_ADDR_REQ ----->| | | \n"); break; case T_ADDR_ACK: printf("T_ADDR_ACK <-----| | | \n"); break; case T_UNBIND_REQ: printf("T_UNBIND_REQ ----->| | | \n"); break; case T_ERROR_ACK: printf("T_ERROR_ACK <----/| | | \n"); printf("[%-11s] | | | \n", err_string(cmd.tpi.error_ack.TLI_error)); break; case T_OK_ACK: printf("T_OK_ACK <----/| | | | \n"); break; case T_CONN_REQ: printf("T_CONN_REQ ----->|--------------->| | | \n"); break; case T_CONN_IND: printf("T_CONN_IND <-----|<---------------| | | \n"); seq[fd] = cmd.tpi.conn_ind.SEQ_number; break; case T_CONN_RES: printf("T_CONN_RES ----->|--------------->| | | \n"); break; case T_CONN_CON: printf("T_CONN_CON <-----|<---------------| | | \n"); break; case T_DATA_REQ: printf("T_DATA_REQ ----->|--------------->| | \n"); break; case T_DATA_IND: printf("T_DATA_IND <-----|<---------------| | \n"); break; case T_EXDATA_REQ: printf("T_EXDATA_REQ ----->|--------------->| | \n"); break; case T_EXDATA_IND: printf("T_EXDATA_IND <-----|<---------------| | \n"); break; case T_OPTDATA_REQ: if ( cmd.tpi.optdata_req.DATA_flag & T_ODF_EX ) printf("T_OPTDATA_REQ ----->|---(%03lu:-U-)--->| | \n", opt_data.sid_val); else printf("T_OPTDATA_REQ ----->|---(%03lu:---)--->| | \n", opt_data.sid_val); break; case T_OPTDATA_IND: if ( cmd.tpi.optdata_ind.DATA_flag & T_ODF_EX ) printf("T_OPTDATA_IND <-----|<--(%03lu:-U-)----| [%010lu] | \n", (ulong)((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->sid_val, (ulong)((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->tsn_val); else printf("T_OPTDATA_IND <-----|<--(%03lu:%03lu)----| [%010lu] | \n", (ulong)((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->sid_val, (ulong)((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->ssn_val, (ulong)((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->tsn_val); tsn[fd] = ((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->tsn_val; sid[fd] = ((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->sid_val; break; case T_DISCON_REQ: printf("T_DISCON_REQ ----->|--------------->| | | \n"); break; case T_DISCON_IND: printf("T_DISCON_IND <-----|<---------------| | | \n"); break; case T_ORDREL_REQ: printf("T_ORDREL_REQ ----->|--------------->| | | \n"); break; case T_ORDREL_IND: printf("T_ORDREL_IND <-----|<---------------| | | \n"); break; default: printf("????%4ld???? ?----?| | \n", cmd.tpi.type); break; } } if ( fd == fd2 ) { switch ( cmd.tpi.type ) { case T_INFO_REQ: printf(" | |<-+------ T_INFO_REQ \n"); break; case T_INFO_ACK: printf(" | |--+-----> T_INFO_ACK \n"); break; case T_OPTMGMT_REQ: printf(" | |<-+------ T_OPTMGMT_REQ\n"); break; case T_OPTMGMT_ACK: printf(" | |--+-----> T_OPTMGMT_ACK\n"); break; case T_BIND_REQ: printf(" | |<-+------ T_BIND_REQ \n"); break; case T_BIND_ACK: printf(" | |--+-----> T_BIND_ACK \n"); break; case T_ADDR_REQ: printf(" | |<-+------ T_ADDR_REQ \n"); break; case T_ADDR_ACK: printf(" | |--+-----> T_ADDR_ACK \n"); break; case T_UNBIND_REQ: printf(" | |<-+------ T_UNBIND_REQ \n"); break; case T_ERROR_ACK: printf(" | |\\-+-----> T_ERROR_ACK \n"); printf(" | | [%-11s]\n", err_string(cmd.tpi.error_ack.TLI_error)); break; case T_OK_ACK: printf(" | | |\\-+-----> T_OK_ACK \n"); break; case T_CONN_REQ: printf(" | |<-------------|<-+------ T_CONN_REQ \n"); break; case T_CONN_IND: printf(" | |------------->|--+-----> T_CONN_IND \n"); seq[fd] = cmd.tpi.conn_ind.SEQ_number; break; case T_CONN_RES: printf(" | |<-------------|<-+------ T_CONN_RES \n"); break; case T_CONN_CON: printf(" | |------------->|--+-----> T_CONN_CON \n"); break; case T_DATA_REQ: printf(" | |<-------------|<-+------ T_DATA_REQ \n"); break; case T_DATA_IND: printf(" | |------------->|--+-----> T_DATA_IND \n"); break; case T_EXDATA_REQ: printf(" | |<-------------|<-+------ T_EXDATA_REQ \n"); break; case T_EXDATA_IND: printf(" | |------------->|--+-----> T_EXDATA_IND \n"); break; case T_OPTDATA_REQ: if ( cmd.tpi.optdata_req.DATA_flag & T_ODF_EX ) printf(" | |<--(%03lu:-U-)--|<-+------ T_OPTDATA_REQ\n", opt_data.sid_val); else printf(" | |<--(%03lu:---)--|<-+------ T_OPTDATA_REQ\n", opt_data.sid_val); break; case T_OPTDATA_IND: if ( cmd.tpi.optdata_ind.DATA_flag & T_ODF_EX ) printf(" | [%010lu] |---(%03lu:-U-)->|--+-----> T_OPTDATA_IND\n", (ulong)((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->tsn_val, (ulong)((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->sid_val); else printf(" | [%010lu] |---(%03lu:%03lu)->|--+-----> T_OPTDATA_IND\n", (ulong)((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->tsn_val, (ulong)((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->sid_val, (ulong)((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->ssn_val); tsn[fd] = ((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->tsn_val; sid[fd] = ((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->sid_val; break; case T_DISCON_REQ: printf(" | |<-------------|<-+------ T_DISCON_REQ \n"); break; case T_DISCON_IND: printf(" | |------------->|--+-----> T_DISCON_IND \n"); break; case T_ORDREL_REQ: printf(" | |<-------------|<-+------ T_ORDREL_REQ \n"); break; case T_ORDREL_IND: printf(" | |------------->|--+-----> T_ORDREL_IND \n"); break; default: printf(" | |?-+-----? ????%4ld???? \n", cmd.tpi.type); break; } } if ( fd == fd3 ) { switch ( cmd.tpi.type ) { case T_INFO_REQ: printf(" | | |<----- T_INFO_REQ \n"); break; case T_INFO_ACK: printf(" | | |-----> T_INFO_ACK \n"); break; case T_OPTMGMT_REQ: printf(" | | |<----- T_OPTMGMT_REQ\n"); break; case T_OPTMGMT_ACK: printf(" | | |-----> T_OPTMGMT_ACK\n"); break; case T_BIND_REQ: printf(" | | |<----- T_BIND_REQ \n"); break; case T_BIND_ACK: printf(" | | |-----> T_BIND_ACK \n"); break; case T_ADDR_REQ: printf(" | | |<----- T_ADDR_REQ \n"); break; case T_ADDR_ACK: printf(" | | |-----> T_ADDR_ACK \n"); break; case T_UNBIND_REQ: printf(" | | |<----- T_UNBIND_REQ \n"); break; case T_ERROR_ACK: printf(" | | |\\----> T_ERROR_ACK \n"); printf(" | | | [%-11s]\n", err_string(cmd.tpi.error_ack.TLI_error)); break; case T_OK_ACK: printf(" | | | |\\----> T_OK_ACK \n"); break; case T_CONN_REQ: printf(" | |<----------------|<----- T_CONN_REQ \n"); break; case T_CONN_IND: printf(" | |---------------->|-----> T_CONN_IND \n"); seq[fd] = cmd.tpi.conn_ind.SEQ_number; break; case T_CONN_RES: printf(" | |<----------------|<----- T_CONN_RES \n"); break; case T_CONN_CON: printf(" | |---------------->|-----> T_CONN_CON \n"); break; case T_DATA_REQ: printf(" | |<----------------|<----- T_DATA_REQ \n"); break; case T_DATA_IND: printf(" | |---------------->|-----> T_DATA_IND \n"); break; case T_EXDATA_REQ: printf(" | |<----------------|<----- T_EXDATA_REQ \n"); break; case T_EXDATA_IND: printf(" | |---------------->|-----> T_EXDATA_IND \n"); break; case T_OPTDATA_REQ: if ( cmd.tpi.optdata_req.DATA_flag & T_ODF_EX ) printf(" | |<---(%03lu:-U-)----|<----- T_OPTDATA_REQ\n", opt_data.sid_val); else printf(" | |<---(%03lu:---)----|<----- T_OPTDATA_REQ\n", opt_data.sid_val); break; case T_OPTDATA_IND: if ( cmd.tpi.optdata_ind.DATA_flag & T_ODF_EX ) printf(" | [%010lu] |----(%03lu:-U-)--->|-----> T_OPTDATA_IND\n", (ulong)((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->tsn_val, (ulong)((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->sid_val); else printf(" | [%010lu] |----(%03lu:%03lu)--->|-----> T_OPTDATA_IND\n", (ulong)((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->tsn_val, (ulong)((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->sid_val, (ulong)((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->ssn_val); tsn[fd] = ((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->tsn_val; sid[fd] = ((rdat_opt_t *)(cmd.cbuf+cmd.tpi.optdata_ind.OPT_offset))->sid_val; break; case T_DISCON_REQ: printf(" | |<----------------|<----- T_DISCON_REQ \n"); break; case T_DISCON_IND: printf(" | |---------------->|-----> T_DISCON_IND \n"); break; case T_ORDREL_REQ: printf(" | |<----------------|<----- T_ORDREL_REQ \n"); break; case T_ORDREL_IND: printf(" | |---------------->|-----> T_ORDREL_IND \n"); break; default: printf(" | | |?----? ????%4ld???? \n", cmd.tpi.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.tpi.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.tpi.type); } 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 put_fdi(int fd, int fd2, int offset, int flags){ fdi.flags = flags; fdi.fildes = fd2; fdi.offset = offset; if ( show ) print_msg(fd); gettimeofday(&when,NULL); if ( ioctl(fd, I_FDINSERT, &fdi) < 0 ) { printf("ERROR: ioctl: [%d] %s\n", errno, strerror(errno)); exit(2); } return(SUCCESS);}int sctp_t_open(void){ int fd; if ( (fd = open("/dev/sctp_t",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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -