📄 test_sockopt.c
字号:
outmessage.msg_flags = 0; cmsg = CMSG_FIRSTHDR(&outmessage); cmsg->cmsg_level = IPPROTO_SCTP; cmsg->cmsg_type = SCTP_SNDRCV; cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo)); outmessage.msg_controllen = cmsg->cmsg_len; sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg); memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo)); ppid = rand(); /* Choose an arbitrary value. */ stream = 1; sinfo->sinfo_ppid = ppid; sinfo->sinfo_stream = stream; outmessage.msg_iov->iov_base = message; outmessage.msg_iov->iov_len = strlen(message) + 1; test_sendmsg(udp_clt_sk, &outmessage, 0, strlen(message)+1); /* Get the communication up message on udp_clt_sk. */ inmessage.msg_controllen = sizeof(incmsg); error = test_recvmsg(udp_clt_sk, &inmessage, MSG_WAITALL); test_check_msg_notification(&inmessage, error, sizeof(struct sctp_assoc_change), SCTP_ASSOC_CHANGE, SCTP_COMM_UP); sac = (struct sctp_assoc_change *)iov.iov_base; udp_clt_associd = sac->sac_assoc_id; /* Compare the SCTP_STATUS result between sctp_opt_info and * getsockopt */ { struct sctp_status status1, status2; memset(&status1, 0, sizeof(status1)); memset(&status2, 0, sizeof(status2)); optlen = sizeof(struct sctp_status); /* Test SCTP_STATUS for udp_clt_sk's given association. */ error = sctp_opt_info(udp_clt_sk,udp_clt_associd,SCTP_STATUS, (char *)&status1, &optlen); if (error != 0) tst_brkm(TBROK, tst_exit, "sctp_opt_info(SCTP_STATUS): %s", strerror(errno)); status2.sstat_assoc_id = udp_clt_associd; error = getsockopt(udp_clt_sk, IPPROTO_SCTP, SCTP_STATUS, (char *)&status2, &optlen); if (error != 0) tst_brkm(TBROK, tst_exit, "getsockopt(SCTP_STATUS): %s", strerror(errno)); if (strncmp((char *)&status1, (char *)&status2, optlen)) tst_brkm(TBROK, tst_exit, "sctp_opt_info(SCTP_STAUS)" "doesn't match getsockopt(SCTP_STATUS)"); tst_resm(TPASS, "sctp_opt_info(SCTP_STATUS)"); } error = 0; /* Shut down the link. */ close(udp_svr_sk); close(udp_clt_sk); /* TEST #4: SCTP_INITMSG socket option. */ /* Create a socket. */ udp_svr_sk = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP); /* Bind this socket to the test port. */ test_bind(udp_svr_sk, &udp_svr_loop.sa, sizeof(udp_svr_loop)); /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */ test_enable_assoc_change(udp_svr_sk); /* Get the default parameters for association initialization. */ optlen = sizeof(initmsg); test_getsockopt(udp_svr_sk, SCTP_INITMSG, &initmsg, &optlen); tst_resm(TPASS, "getsockopt(SCTP_INITMSG)"); /* Change the parameters for association initialization. */ initmsg.sinit_num_ostreams = 5; initmsg.sinit_max_instreams = 5; initmsg.sinit_max_attempts = 3; initmsg.sinit_max_init_timeo = 30; test_setsockopt(udp_svr_sk, SCTP_INITMSG, &initmsg, sizeof(initmsg)); tst_resm(TPASS, "setsockopt(SCTP_INITMSG)"); /* Get the updated parameters for association initialization. */ optlen = sizeof(initmsg); test_getsockopt(udp_svr_sk, SCTP_INITMSG, &initmsg, &optlen); close(udp_svr_sk); /* TEST #5: SCTP_PEER_ADDR_PARAMS socket option. */ /* Create a socket. */ udp_svr_sk = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP); /* Get the default parameters for this endpoint */ optlen = sizeof(paddrparams); memset(&paddrparams, 0, sizeof(paddrparams)); paddrparams.spp_address.ss_family = AF_INET; test_getsockopt(udp_svr_sk, SCTP_PEER_ADDR_PARAMS, &paddrparams, &optlen); dflt_pathmaxrxt = paddrparams.spp_pathmaxrxt; tst_resm(TPASS, "getsockopt(SCTP_PEER_ADDR_PARAMS)"); /* Change the default parameters for this endpoint (socket) */ paddrparams.spp_hbinterval = 1000; paddrparams.spp_pathmaxrxt = dflt_pathmaxrxt+1; paddrparams.spp_sackdelay = 100; test_setsockopt(udp_svr_sk, SCTP_PEER_ADDR_PARAMS, &paddrparams, sizeof(paddrparams)); paddrparams.spp_pathmaxrxt = 0; /* Get the updated default parameters for this endpoint. */ optlen = sizeof(paddrparams); test_getsockopt(udp_svr_sk, SCTP_PEER_ADDR_PARAMS, &paddrparams, &optlen); if (paddrparams.spp_pathmaxrxt != dflt_pathmaxrxt+1) tst_brkm(TBROK, tst_exit, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "mismatch"); value.assoc_id = 0; optlen = sizeof(value); test_getsockopt(udp_svr_sk, SCTP_DELAYED_ACK_TIME, &value, &optlen); if (value.assoc_value != 100) tst_brkm(TBROK, tst_exit, "getsockopt(SCTP_DELAYED_ACK_TIME) " "mismatch"); value.assoc_id = 0; value.assoc_value = 250; test_setsockopt(udp_svr_sk, SCTP_DELAYED_ACK_TIME, &value, sizeof(value)); optlen = sizeof(paddrparams); test_getsockopt(udp_svr_sk, SCTP_PEER_ADDR_PARAMS, &paddrparams, &optlen); if (paddrparams.spp_sackdelay != 250) tst_brkm(TBROK, tst_exit, "setsockopt(SCTP_DELAYED_ACK_TIME) " "mismatch"); tst_resm(TPASS, "setsockopt(SCTP_DELAYED_ACK_TIME)"); /* Ensure that prior defaults are preserved for a new endpoint */ udp_clt_sk = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP); optlen = sizeof(paddrparams); memset(&paddrparams, 0, sizeof(paddrparams)); paddrparams.spp_address.ss_family = AF_INET; test_getsockopt(udp_clt_sk, SCTP_PEER_ADDR_PARAMS, &paddrparams, &optlen); if (paddrparams.spp_pathmaxrxt != dflt_pathmaxrxt) tst_brkm(TBROK, tst_exit, "getsockopt(SCTP_PEER_ADDR_PARAMS) " "mismatch"); tst_resm(TPASS, "setsockopt(SCTP_PEER_ADDR_PARAMS)"); /* Invalid assoc id */ paddrparams.spp_assoc_id = 1234; error = setsockopt(udp_clt_sk, SOL_SCTP, SCTP_PEER_ADDR_PARAMS, &paddrparams, sizeof(paddrparams)); if ((-1 != error) || (EINVAL != errno)) tst_brkm(TBROK, tst_exit, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "invalid associd error:%d, errno:%d\n", error, errno); tst_resm(TPASS, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "- one-to-many style invalid associd"); test_bind(udp_svr_sk, &udp_svr_loop.sa, sizeof(udp_svr_loop)); test_bind(udp_clt_sk, &udp_clt_loop.sa, sizeof(udp_clt_loop)); test_listen(udp_svr_sk, 5); test_enable_assoc_change(udp_svr_sk); test_enable_assoc_change(udp_clt_sk); /* Do a connect on a UDP-style socket and establish an association. */ test_connect(udp_clt_sk, &udp_svr_loop.sa, sizeof(udp_svr_loop)); /* Receive the COMM_UP notifications and get the associd's */ inmessage.msg_controllen = sizeof(incmsg); error = test_recvmsg(udp_svr_sk, &inmessage, MSG_WAITALL); test_check_msg_notification(&inmessage, error, sizeof(struct sctp_assoc_change), SCTP_ASSOC_CHANGE, SCTP_COMM_UP); sac = (struct sctp_assoc_change *)iov.iov_base; paddrparams.spp_assoc_id = sac->sac_assoc_id; memcpy(&paddrparams.spp_address, &udp_clt_loop, sizeof(udp_clt_loop)); paddrparams.spp_hbinterval = 1000; paddrparams.spp_pathmaxrxt = dflt_pathmaxrxt+1; test_setsockopt(udp_svr_sk, SCTP_PEER_ADDR_PARAMS, &paddrparams, sizeof(paddrparams)); tst_resm(TPASS, "setsockopt(SCTP_PEER_ADDR_PARAMS) - " "one-to-many style valid associd valid address"); paddrparams.spp_assoc_id = sac->sac_assoc_id; memcpy(&paddrparams.spp_address, &udp_svr_loop, sizeof(udp_svr_loop)); paddrparams.spp_hbinterval = 1000; paddrparams.spp_pathmaxrxt = dflt_pathmaxrxt+1; error = setsockopt(udp_clt_sk, SOL_SCTP, SCTP_PEER_ADDR_PARAMS, &paddrparams, sizeof(paddrparams)); if ((-1 != error) || (EINVAL != errno)) tst_brkm(TBROK, tst_exit, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "invalid transport error:%d, errno:%d\n", error, errno); tst_resm(TPASS, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "- one-to-many style invalid transport"); paddrparams.spp_assoc_id = sac->sac_assoc_id; memcpy(&paddrparams.spp_address, &udp_clt_loop, sizeof(udp_clt_loop)); paddrparams.spp_hbinterval = 1000; paddrparams.spp_pathmaxrxt = dflt_pathmaxrxt+1; error = setsockopt(udp_clt_sk, SOL_SCTP, SCTP_PEER_ADDR_PARAMS, &paddrparams, sizeof(paddrparams) - 1); if ((-1 != error) || (EINVAL != errno)) tst_brkm(TBROK, tst_exit, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "invalid parameter length error:%d, errno:%d\n", error, errno); tst_resm(TPASS, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "- one-to-many style invalid parameter length"); error = setsockopt(udp_clt_sk, SOL_SCTP, SCTP_DELAYED_ACK_TIME, &value, sizeof(value) - 1); if ((-1 != error) || (EINVAL != errno)) tst_brkm(TBROK, tst_exit, "setsockopt(SCTP_DELAYED_ACK_TIME) " "invalid parameter length error:%d, errno:%d\n", error, errno); tst_resm(TPASS, "setsockopt(SCTP_DELAYED_ACK_TIME) " "- one-to-many style invalid parameter length"); memset(&paddrparams, 0, sizeof(paddrparams)); paddrparams.spp_assoc_id = sac->sac_assoc_id; memcpy(&paddrparams.spp_address, &udp_clt_loop, sizeof(udp_clt_loop)); paddrparams.spp_sackdelay = 501; error = setsockopt(udp_clt_sk, SOL_SCTP, SCTP_PEER_ADDR_PARAMS, &paddrparams, sizeof(paddrparams)); if ((-1 != error) || (EINVAL != errno)) tst_brkm(TBROK, tst_exit, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "invalid sack delay error:%d, errno:%d\n", error, errno); tst_resm(TPASS, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "- one-to-many style invalid sack delay"); value.assoc_id = sac->sac_assoc_id; value.assoc_value = 501; error = setsockopt(udp_clt_sk, SOL_SCTP, SCTP_DELAYED_ACK_TIME, &value, sizeof(value)); if ((-1 != error) || (EINVAL != errno)) tst_brkm(TBROK, tst_exit, "setsockopt(SCTP_DELAYED_ACK_TIME) " "invalid sack delay error:%d, errno:%d\n", error, errno); tst_resm(TPASS, "setsockopt(SCTP_DELAYED_ACK_TIME) " "- one-to-many style invalid sack delay"); memset(&paddrparams, 0, sizeof(paddrparams)); paddrparams.spp_assoc_id = sac->sac_assoc_id; memcpy(&paddrparams.spp_address, &udp_clt_loop, sizeof(udp_clt_loop)); paddrparams.spp_pathmtu = 511; error = setsockopt(udp_clt_sk, SOL_SCTP, SCTP_PEER_ADDR_PARAMS, &paddrparams, sizeof(paddrparams)); if ((-1 != error) || (EINVAL != errno)) tst_brkm(TBROK, tst_exit, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "invalid path MTU error:%d, errno:%d\n", error, errno); tst_resm(TPASS, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "- one-to-many style invalid path MTU"); memset(&paddrparams, 0, sizeof(paddrparams)); paddrparams.spp_assoc_id = sac->sac_assoc_id; memcpy(&paddrparams.spp_address, &udp_clt_loop, sizeof(udp_clt_loop)); paddrparams.spp_flags = SPP_HB_ENABLE | SPP_HB_DISABLE; error = setsockopt(udp_clt_sk, SOL_SCTP, SCTP_PEER_ADDR_PARAMS, &paddrparams, sizeof(paddrparams)); if ((-1 != error) || (EINVAL != errno)) tst_brkm(TBROK, tst_exit, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "invalid hb enable flags error:%d, errno:%d\n", error, errno); tst_resm(TPASS, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "- one-to-many style invalid hb enable flags"); memset(&paddrparams, 0, sizeof(paddrparams)); paddrparams.spp_assoc_id = sac->sac_assoc_id; memcpy(&paddrparams.spp_address, &udp_clt_loop, sizeof(udp_clt_loop)); paddrparams.spp_flags = SPP_PMTUD_ENABLE | SPP_PMTUD_DISABLE; error = setsockopt(udp_clt_sk, SOL_SCTP, SCTP_PEER_ADDR_PARAMS, &paddrparams, sizeof(paddrparams)); if ((-1 != error) || (EINVAL != errno)) tst_brkm(TBROK, tst_exit, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "invalid PMTU discovery enable flags error:%d, errno:%d\n", error, errno); tst_resm(TPASS, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "- one-to-many style invalid PMTU discovery enable flags"); memset(&paddrparams, 0, sizeof(paddrparams)); paddrparams.spp_assoc_id = sac->sac_assoc_id; memcpy(&paddrparams.spp_address, &udp_clt_loop, sizeof(udp_clt_loop)); paddrparams.spp_flags = SPP_SACKDELAY_ENABLE | SPP_SACKDELAY_DISABLE; error = setsockopt(udp_clt_sk, SOL_SCTP, SCTP_PEER_ADDR_PARAMS, &paddrparams, sizeof(paddrparams)); if ((-1 != error) || (EINVAL != errno)) tst_brkm(TBROK, tst_exit, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "invalid sack delay enable flags error:%d, errno:%d\n", error, errno); tst_resm(TPASS, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "- one-to-many style invalid sack delay enable flags"); memset(&paddrparams, 0, sizeof(paddrparams)); paddrparams.spp_flags = SPP_HB_DEMAND; error = setsockopt(udp_clt_sk, SOL_SCTP, SCTP_PEER_ADDR_PARAMS, &paddrparams, sizeof(paddrparams)); if ((-1 != error) || (EINVAL != errno)) tst_brkm(TBROK, tst_exit, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "invalid hb demand error:%d, errno:%d\n", error, errno); tst_resm(TPASS, "setsockopt(SCTP_PEER_ADDR_PARAMS) " "- one-to-many style invalid hb demand"); close(udp_svr_sk); close(udp_clt_sk); /* TEST #6: SCTP_DEFAULT_SEND_PARAM socket option. */ /* Create and bind 2 UDP-style sockets(udp_svr_sk, udp_clt_sk) and * 2 TCP-style sockets. (tcp_svr_sk, tcp_clt_sk) */ udp_svr_sk = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP); udp_clt_sk = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP); tcp_svr_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP); tcp_clt_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP); /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */ test_enable_assoc_change(udp_svr_sk); test_enable_assoc_change(udp_clt_sk); test_enable_assoc_change(tcp_svr_sk); test_enable_assoc_change(tcp_clt_sk); test_bind(udp_svr_sk, &udp_svr_loop.sa, sizeof(udp_svr_loop)); test_bind(udp_clt_sk, &udp_clt_loop.sa, sizeof(udp_clt_loop)); test_bind(tcp_svr_sk, &tcp_svr_loop.sa, sizeof(tcp_svr_loop)); test_bind(tcp_clt_sk, &tcp_clt_loop.sa, sizeof(tcp_clt_loop)); /* Mark udp_svr_sk and tcp_svr_sk as being able to accept new * associations. */ test_listen(udp_svr_sk, 5); test_listen(tcp_svr_sk, 5); /* Set default send parameters on the unconnected UDP-style sockets. */ memset(&set_udp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); set_udp_sk_dflt_param.sinfo_ppid = 1000;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -