📄 test-sctp_n2.c
字号:
static int timer_timeout = 0;static int last_signum = 0;static voidsignal_handler(int signum){ last_signum = signum; if (signum == SIGALRM) timer_timeout = 1; return;}static intstart_signals(void){ sigset_t mask; struct sigaction act; act.sa_handler = signal_handler;// act.sa_flags = SA_RESTART | SA_ONESHOT; act.sa_flags = 0; sigemptyset(&act.sa_mask); if (sigaction(SIGALRM, &act, NULL)) return __RESULT_FAILURE; if (sigaction(SIGPOLL, &act, NULL)) return __RESULT_FAILURE; if (sigaction(SIGURG, &act, NULL)) return __RESULT_FAILURE; if (sigaction(SIGPIPE, &act, NULL)) return __RESULT_FAILURE; if (sigaction(SIGHUP, &act, NULL)) return __RESULT_FAILURE; sigemptyset(&mask); sigaddset(&mask, SIGALRM); sigaddset(&mask, SIGPOLL); sigaddset(&mask, SIGURG); sigaddset(&mask, SIGPIPE); sigaddset(&mask, SIGHUP); sigprocmask(SIG_UNBLOCK, &mask, NULL); siginterrupt(SIGALRM, 1); siginterrupt(SIGPOLL, 1); siginterrupt(SIGURG, 1); siginterrupt(SIGPIPE, 1); siginterrupt(SIGHUP, 1); return __RESULT_SUCCESS;}/* * Start an interval timer as the overall test timer. */static intstart_tt(long duration){ struct itimerval setting = { {0, 0}, {duration / 1000, (duration % 1000) * 1000} }; if (duration == (long) INFINITE_WAIT) return __RESULT_SUCCESS; if (start_signals()) return __RESULT_FAILURE; if (setitimer(ITIMER_REAL, &setting, NULL)) return __RESULT_FAILURE; timer_timeout = 0; return __RESULT_SUCCESS;}#if 0static intstart_st(long duration){ long sdur = (duration + timer_scale - 1) / timer_scale; return start_tt(sdur);}#endifstatic intstop_signals(void){ int result = __RESULT_SUCCESS; sigset_t mask; struct sigaction act; act.sa_handler = SIG_DFL; act.sa_flags = 0; sigemptyset(&act.sa_mask); if (sigaction(SIGALRM, &act, NULL)) result = __RESULT_FAILURE; if (sigaction(SIGPOLL, &act, NULL)) result = __RESULT_FAILURE; if (sigaction(SIGURG, &act, NULL)) result = __RESULT_FAILURE; if (sigaction(SIGPIPE, &act, NULL)) result = __RESULT_FAILURE; if (sigaction(SIGHUP, &act, NULL)) result = __RESULT_FAILURE; sigemptyset(&mask); sigaddset(&mask, SIGALRM); sigaddset(&mask, SIGPOLL); sigaddset(&mask, SIGURG); sigaddset(&mask, SIGPIPE); sigaddset(&mask, SIGHUP); sigprocmask(SIG_BLOCK, &mask, NULL); return (result);}static intstop_tt(void){ struct itimerval setting = { {0, 0}, {0, 0} }; int result = __RESULT_SUCCESS; if (setitimer(ITIMER_REAL, &setting, NULL)) return __RESULT_FAILURE; if (stop_signals() != __RESULT_SUCCESS) result = __RESULT_FAILURE; timer_timeout = 0; return (result);}/* * Addresses */#if 1#ifndef SCTP_VERSION_2addr_t addrs[4];#else /* SCTP_VERSION_2 */struct sockaddr_in addrs[4][3];#endif /* SCTP_VERSION_2 */#elsestruct sockaddr_in addrs[4];#endifint anums[4] = { 3, 3, 3, 3 };#define TEST_PORT_NUMBER 18000unsigned short ports[4] = { TEST_PORT_NUMBER+0, TEST_PORT_NUMBER+1, TEST_PORT_NUMBER+2, TEST_PORT_NUMBER+3 };const char *addr_strings[4] = { "127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.0.4" };/* * Options */N_qos_sel_data_sctp_t qos_data = { .n_qos_type = N_QOS_SEL_DATA_SCTP, .ppi = 10, .sid = 0, .ssn = 0, .tsn = 0, .more = 0,};N_qos_sel_conn_sctp_t qos_conn = { .n_qos_type = N_QOS_SEL_CONN_SCTP, .i_streams = 1, .o_streams = 1,};N_qos_sel_info_sctp_t qos_info = { .n_qos_type = N_QOS_SEL_INFO_SCTP, .i_streams = 1, .o_streams = 1, .ppi = 10, .sid = 0, .max_inits = 12, .max_retrans = 12, .ck_life = -1, .ck_inc = -1, .hmac = -1, .throttle = -1, .max_sack = 0, .rto_ini = 0, .rto_min = 0, .rto_max = 0, .rtx_path = 0, .hb_itvl = 200, .options = 0,};char *errno_string(long err){ switch (err) { case 0: return ("ok"); case EPERM: return ("[EPERM]"); case ENOENT: return ("[ENOENT]"); case ESRCH: return ("[ESRCH]"); case EINTR: return ("[EINTR]"); case EIO: return ("[EIO]"); case ENXIO: return ("[ENXIO]"); case E2BIG: return ("[E2BIG]"); case ENOEXEC: return ("[ENOEXEC]"); case EBADF: return ("[EBADF]"); case ECHILD: return ("[ECHILD]"); case EAGAIN: return ("[EAGAIN]"); case ENOMEM: return ("[ENOMEM]"); case EACCES: return ("[EACCES]"); case EFAULT: return ("[EFAULT]"); case ENOTBLK: return ("[ENOTBLK]"); case EBUSY: return ("[EBUSY]"); case EEXIST: return ("[EEXIST]"); case EXDEV: return ("[EXDEV]"); case ENODEV: return ("[ENODEV]"); case ENOTDIR: return ("[ENOTDIR]"); case EISDIR: return ("[EISDIR]"); case EINVAL: return ("[EINVAL]"); case ENFILE: return ("[ENFILE]"); case EMFILE: return ("[EMFILE]"); case ENOTTY: return ("[ENOTTY]"); case ETXTBSY: return ("[ETXTBSY]"); case EFBIG: return ("[EFBIG]"); case ENOSPC: return ("[ENOSPC]"); case ESPIPE: return ("[ESPIPE]"); case EROFS: return ("[EROFS]"); case EMLINK: return ("[EMLINK]"); case EPIPE: return ("[EPIPE]"); case EDOM: return ("[EDOM]"); case ERANGE: return ("[ERANGE]"); case EDEADLK: return ("[EDEADLK]"); case ENAMETOOLONG: return ("[ENAMETOOLONG]"); case ENOLCK: return ("[ENOLCK]"); case ENOSYS: return ("[ENOSYS]"); case ENOTEMPTY: return ("[ENOTEMPTY]"); case ELOOP: return ("[ELOOP]"); case ENOMSG: return ("[ENOMSG]"); case EIDRM: return ("[EIDRM]"); case ECHRNG: return ("[ECHRNG]"); case EL2NSYNC: return ("[EL2NSYNC]"); case EL3HLT: return ("[EL3HLT]"); case EL3RST: return ("[EL3RST]"); case ELNRNG: return ("[ELNRNG]"); case EUNATCH: return ("[EUNATCH]"); case ENOCSI: return ("[ENOCSI]"); case EL2HLT: return ("[EL2HLT]"); case EBADE: return ("[EBADE]"); case EBADR: return ("[EBADR]"); case EXFULL: return ("[EXFULL]"); case ENOANO: return ("[ENOANO]"); case EBADRQC: return ("[EBADRQC]"); case EBADSLT: return ("[EBADSLT]"); case EBFONT: return ("[EBFONT]"); case ENOSTR: return ("[ENOSTR]"); case ENODATA: return ("[ENODATA]"); case ETIME: return ("[ETIME]"); case ENOSR: return ("[ENOSR]"); case ENONET: return ("[ENONET]"); case ENOPKG: return ("[ENOPKG]"); case EREMOTE: return ("[EREMOTE]"); case ENOLINK: return ("[ENOLINK]"); case EADV: return ("[EADV]"); case ESRMNT: return ("[ESRMNT]"); case ECOMM: return ("[ECOMM]"); case EPROTO: return ("[EPROTO]"); case EMULTIHOP: return ("[EMULTIHOP]"); case EDOTDOT: return ("[EDOTDOT]"); case EBADMSG: return ("[EBADMSG]"); case EOVERFLOW: return ("[EOVERFLOW]"); case ENOTUNIQ: return ("[ENOTUNIQ]"); case EBADFD: return ("[EBADFD]"); case EREMCHG: return ("[EREMCHG]"); case ELIBACC: return ("[ELIBACC]"); case ELIBBAD: return ("[ELIBBAD]"); case ELIBSCN: return ("[ELIBSCN]"); case ELIBMAX: return ("[ELIBMAX]"); case ELIBEXEC: return ("[ELIBEXEC]"); case EILSEQ: return ("[EILSEQ]"); case ERESTART: return ("[ERESTART]"); case ESTRPIPE: return ("[ESTRPIPE]"); case EUSERS: return ("[EUSERS]"); case ENOTSOCK: return ("[ENOTSOCK]"); case EDESTADDRREQ: return ("[EDESTADDRREQ]"); case EMSGSIZE: return ("[EMSGSIZE]"); case EPROTOTYPE: return ("[EPROTOTYPE]"); case ENOPROTOOPT: return ("[ENOPROTOOPT]"); case EPROTONOSUPPORT: return ("[EPROTONOSUPPORT]"); case ESOCKTNOSUPPORT: return ("[ESOCKTNOSUPPORT]"); case EOPNOTSUPP: return ("[EOPNOTSUPP]"); case EPFNOSUPPORT: return ("[EPFNOSUPPORT]"); case EAFNOSUPPORT: return ("[EAFNOSUPPORT]"); case EADDRINUSE: return ("[EADDRINUSE]"); case EADDRNOTAVAIL: return ("[EADDRNOTAVAIL]"); case ENETDOWN: return ("[ENETDOWN]"); case ENETUNREACH: return ("[ENETUNREACH]"); case ENETRESET: return ("[ENETRESET]"); case ECONNABORTED: return ("[ECONNABORTED]"); case ECONNRESET: return ("[ECONNRESET]"); case ENOBUFS: return ("[ENOBUFS]"); case EISCONN: return ("[EISCONN]"); case ENOTCONN: return ("[ENOTCONN]"); case ESHUTDOWN: return ("[ESHUTDOWN]"); case ETOOMANYREFS: return ("[ETOOMANYREFS]"); case ETIMEDOUT: return ("[ETIMEDOUT]"); case ECONNREFUSED: return ("[ECONNREFUSED]"); case EHOSTDOWN: return ("[EHOSTDOWN]"); case EHOSTUNREACH: return ("[EHOSTUNREACH]"); case EALREADY: return ("[EALREADY]"); case EINPROGRESS: return ("[EINPROGRESS]"); case ESTALE: return ("[ESTALE]"); case EUCLEAN: return ("[EUCLEAN]"); case ENOTNAM: return ("[ENOTNAM]"); case ENAVAIL: return ("[ENAVAIL]"); case EISNAM: return ("[EISNAM]"); case EREMOTEIO: return ("[EREMOTEIO]"); case EDQUOT: return ("[EDQUOT]"); case ENOMEDIUM: return ("[ENOMEDIUM]"); case EMEDIUMTYPE: return ("[EMEDIUMTYPE]"); default: { static char buf[32]; snprintf(buf, sizeof(buf), "[%ld]", (long) err); return buf; } }}char *nerrno_string(ulong nerr, long uerr){ switch (nerr) { case NBADADDR: return ("[NBADADDR]"); case NBADOPT: return ("[NBADOPT]"); case NACCESS: return ("[NACCESS]"); case NNOADDR: return ("[NNOADDR]"); case NOUTSTATE: return ("[NOUTSTATE]"); case NBADSEQ: return ("[NBADSEQ]"); case NSYSERR: return errno_string(uerr); case NBADDATA: return ("[NBADDATA]"); case NBADFLAG: return ("[NBADFLAG]"); case NNOTSUPPORT: return ("[NNOTSUPPORT]"); case NBOUND: return ("[NBOUND]"); case NBADQOSPARAM: return ("[NBADQOSPARAM]"); case NBADQOSTYPE: return ("[NBADQOSTYPE]"); case NBADTOKEN: return ("[NBADTOKEN]"); case NNOPROTOID: return ("[NNOPROTOID]"); default: { static char buf[32]; snprintf(buf, sizeof(buf), "[%lu]", (ulong) nerr); return buf; } }}const char *event_string(int child, int event){ switch (event) { case __EVENT_EOF: return ("END OF FILE"); case __EVENT_NO_MSG: return ("NO MESSAGE"); case __EVENT_TIMEOUT: return ("TIMEOUT"); case __EVENT_UNKNOWN: return ("UNKNOWN"); case __RESULT_DECODE_ERROR: return ("DECODE ERROR"); case __RESULT_SCRIPT_ERROR: return ("SCRIPT ERROR"); case __RESULT_INCONCLUSIVE: return ("INCONCLUSIVE"); case __RESULT_SUCCESS: return ("SUCCESS"); case __RESULT_FAILURE: return ("FAILURE"); case __TEST_CONN_REQ: return ("N_CONN_REQ"); case __TEST_CONN_RES: return ("N_CONN_RES"); case __TEST_DISCON_REQ: return ("N_DISCON_REQ"); case __TEST_DATA_REQ: return ("N_DATA_REQ"); case __TEST_EXDATA_REQ: return ("N_EXDATA_REQ"); case __TEST_INFO_REQ: return ("N_INFO_REQ"); case __TEST_BIND_REQ:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -