📄 test_sockopt.c
字号:
test_setsockopt(udp_svr_sk, SCTP_DEFAULT_SEND_PARAM, &set_udp_sk_dflt_param, sizeof(set_udp_sk_dflt_param)); memset(&set_udp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); set_udp_sk_dflt_param.sinfo_ppid = 1000; test_setsockopt(udp_clt_sk, SCTP_DEFAULT_SEND_PARAM, &set_udp_sk_dflt_param, sizeof(set_udp_sk_dflt_param)); tst_resm(TPASS, "setsockopt(SCTP_DEFAULT_SEND_PARAM) - " "one-to-many style socket"); /* Get default send parameters on the unconnected UDP-style socket. */ memset(&get_udp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); optlen = sizeof(get_udp_sk_dflt_param); test_getsockopt(udp_svr_sk, SCTP_DEFAULT_SEND_PARAM, &get_udp_sk_dflt_param, &optlen); /* Verify that the get param matches set param. */ if (set_udp_sk_dflt_param.sinfo_ppid != get_udp_sk_dflt_param.sinfo_ppid) tst_brkm(TBROK, tst_exit, "getsockopt(SCTP_DEFAULT_SEND_PARAM) " "mismatch."); /* Get default send parameters on the unconnected UDP-style socket. */ memset(&get_udp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); optlen = sizeof(get_udp_sk_dflt_param); test_getsockopt(udp_clt_sk, SCTP_DEFAULT_SEND_PARAM, &get_udp_sk_dflt_param, &optlen); /* Verify that the get param matches set param. */ if (set_udp_sk_dflt_param.sinfo_ppid != get_udp_sk_dflt_param.sinfo_ppid) tst_brkm(TBROK, tst_exit, "getsockopt(SCTP_DEFAULT_SEND_PARAM) " "mismatch."); tst_resm(TPASS, "getsockopt(SCTP_DEFAULT_SEND_PARAM) - " "one-to-many style socket"); /* Verify that trying to set send params with an invalid assoc id * on an UDP-style socket fails. */ memset(&set_udp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); set_udp_sk_dflt_param.sinfo_ppid = 1000; /* Invalid assoc id */ set_udp_sk_dflt_param.sinfo_assoc_id = 1234; error = setsockopt(udp_clt_sk, SOL_SCTP, SCTP_DEFAULT_SEND_PARAM, &set_udp_sk_dflt_param, sizeof(set_udp_sk_dflt_param)); if ((-1 != error) || (EINVAL != errno)) tst_brkm(TBROK, tst_exit, "setsockopt(SCTP_DEFAULT_SEND_PARAM) " "invalid associd error:%d, errno:%d\n", error, errno); tst_resm(TPASS, "setsockopt(SCTP_DEFAULT_SEND_PARAM) " "- one-to-many style invalid associd"); /* 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; udp_svr_associd = sac->sac_assoc_id; 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; /* Verify that trying to set send params with an assoc id not * belonging to the socket on an UDP-style socket fails. */ memset(&set_udp_assoc_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); set_udp_assoc_dflt_param.sinfo_ppid = 3000; set_udp_assoc_dflt_param.sinfo_assoc_id = udp_clt_associd; error = setsockopt(udp_svr_sk, SOL_SCTP, SCTP_DEFAULT_SEND_PARAM, &set_udp_assoc_dflt_param, sizeof(set_udp_assoc_dflt_param)); if ((-1 != error) || (EINVAL != errno)) tst_brkm(TBROK, tst_exit, "setsockopt(SCTP_DEFAULT_SEND_PARAM) " "associd belonging to another socket " "error:%d, errno:%d", error, errno); tst_resm(TPASS, "setsockopt(SCTP_DEFAULT_SEND_PARAM) - " "one-to-many style associd belonging to another socket"); /* Set default send parameters of an association on the listening * UDP-style socket with a valid associd. */ memset(&set_udp_assoc_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); set_udp_assoc_dflt_param.sinfo_ppid = 3000; set_udp_assoc_dflt_param.sinfo_assoc_id = udp_svr_associd; test_setsockopt(udp_svr_sk, SCTP_DEFAULT_SEND_PARAM, &set_udp_assoc_dflt_param, sizeof(set_udp_assoc_dflt_param)); tst_resm(TPASS, "setsockopt(SCTP_DEFAULT_SEND_PARAM) - " "one-to-many style valid associd"); /* Get default send parameters of an association on the listening * UDP-style socket with a valid associd. */ memset(&get_udp_assoc_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); get_udp_assoc_dflt_param.sinfo_assoc_id = udp_svr_associd ; optlen = sizeof(get_udp_assoc_dflt_param); test_getsockopt(udp_svr_sk, SCTP_DEFAULT_SEND_PARAM, &get_udp_assoc_dflt_param, &optlen); /* Verify that the get param matches the set param. */ if (get_udp_assoc_dflt_param.sinfo_ppid != set_udp_assoc_dflt_param.sinfo_ppid) tst_brkm(TBROK, tst_exit, "getsockopt(SCTP_DEFAULT_SEND_PARAM) " "mismatch."); tst_resm(TPASS, "getsockopt(SCTP_DEFAULT_SEND_PARAM) - " "one-to-many style valid associd"); /* Get default send parameters of an association on the connected * UDP-style socket with zero associd. This should return the * socket wide default parameters. */ memset(&get_udp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); get_udp_sk_dflt_param.sinfo_assoc_id = 0 ; optlen = sizeof(get_udp_sk_dflt_param); test_getsockopt(udp_clt_sk, SCTP_DEFAULT_SEND_PARAM, &get_udp_sk_dflt_param, &optlen); /* Verify that the get param matches the socket-wide set param. */ if (get_udp_sk_dflt_param.sinfo_ppid != set_udp_sk_dflt_param.sinfo_ppid) tst_brkm(TBROK, tst_exit, "getsockopt(SCTP_DEFAULT_SEND_PARAM) " "mismatch."); tst_resm(TPASS, "getsockopt(SCTP_DEFAULT_SEND_PARAM) - " "one-to-many style zero associd"); peeloff_sk = test_sctp_peeloff(udp_svr_sk, udp_svr_associd); /* Get default send parameters of an association on the peeled off * UDP-style socket. This should return the association's default * parameters. */ memset(&get_peeloff_assoc_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); get_peeloff_assoc_dflt_param.sinfo_assoc_id = 0 ; optlen = sizeof(get_peeloff_assoc_dflt_param); test_getsockopt(peeloff_sk, SCTP_DEFAULT_SEND_PARAM, &get_peeloff_assoc_dflt_param, &optlen); /* Verify that the get param matches the association's set param. */ if (get_peeloff_assoc_dflt_param.sinfo_ppid != set_udp_assoc_dflt_param.sinfo_ppid) tst_brkm(TBROK, tst_exit, "getsockopt(SCTP_DEFAULT_SEND_PARAM) " "mismatch."); tst_resm(TPASS, "getsockopt(SCTP_DEFAULT_SEND_PARAM) - " "one-to-many style peeled off socket"); /* Set default send parameters on the unconnected TCP-style sockets. */ memset(&set_tcp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); set_tcp_sk_dflt_param.sinfo_ppid = 2000; /* Invalid assoc id, ignored on a TCP-style socket. */ set_tcp_sk_dflt_param.sinfo_assoc_id = 1234; test_setsockopt(tcp_svr_sk, SCTP_DEFAULT_SEND_PARAM, &set_tcp_sk_dflt_param, sizeof(set_tcp_sk_dflt_param)); /* Set default send parameters on the unconnected TCP-style sockets. */ memset(&set_tcp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); set_tcp_sk_dflt_param.sinfo_ppid = 2000; /* Invalid assoc id, ignored on a TCP-style socket. */ set_tcp_sk_dflt_param.sinfo_assoc_id = 1234; test_setsockopt(tcp_clt_sk, SCTP_DEFAULT_SEND_PARAM, &set_tcp_sk_dflt_param, sizeof(set_tcp_sk_dflt_param)); tst_resm(TPASS, "setsockopt(SCTP_DEFAULT_SEND_PARAM) - " "one-to-one style socket"); /* Get default send parameters on the unconnected TCP-style socket. */ memset(&get_tcp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); optlen = sizeof(get_tcp_sk_dflt_param); test_getsockopt(tcp_svr_sk, SCTP_DEFAULT_SEND_PARAM, &get_tcp_sk_dflt_param, &optlen); /* Verify that the get param matches set param. */ if (set_tcp_sk_dflt_param.sinfo_ppid != get_tcp_sk_dflt_param.sinfo_ppid) tst_brkm(TBROK, tst_exit, "getsockopt(SCTP_DEFAULT_SEND_PARAM) " "mismatch."); /* Get default send parameters on the unconnected TCP-style socket. */ memset(&get_tcp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); optlen = sizeof(get_tcp_sk_dflt_param); test_getsockopt(tcp_clt_sk, SCTP_DEFAULT_SEND_PARAM, &get_tcp_sk_dflt_param, &optlen); /* Verify that the get param matches set param. */ if (set_tcp_sk_dflt_param.sinfo_ppid != get_tcp_sk_dflt_param.sinfo_ppid) tst_brkm(TBROK, tst_exit, "getsockopt(SCTP_DEFAULT_SEND_PARAM) " "mismatch."); tst_resm(TPASS, "getsockopt(SCTP_DEFAULT_SEND_PARAM) - " "one-to-one style socket"); /* Do a connect on a TCP-style socket and establish an association. */ test_connect(tcp_clt_sk, &tcp_svr_loop.sa, sizeof(tcp_svr_loop)); /* Set default send parameters of an association on the connected * TCP-style socket. */ memset(&set_tcp_assoc_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); set_tcp_assoc_dflt_param.sinfo_ppid = 4000; set_tcp_assoc_dflt_param.sinfo_assoc_id = 0; test_setsockopt(tcp_clt_sk, SCTP_DEFAULT_SEND_PARAM, &set_tcp_assoc_dflt_param, sizeof(set_tcp_assoc_dflt_param)); tst_resm(TPASS, "setsockopt(SCTP_DEFAULT_SEND_PARAM) - " "one-to-one style assoc"); /* Get default send parameters of an association on the connected * TCP-style socket. */ memset(&get_tcp_assoc_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); optlen = sizeof(get_tcp_assoc_dflt_param); test_getsockopt(tcp_clt_sk, SCTP_DEFAULT_SEND_PARAM, &get_tcp_assoc_dflt_param, &optlen); if (set_tcp_assoc_dflt_param.sinfo_ppid != get_tcp_assoc_dflt_param.sinfo_ppid) tst_brkm(TBROK, tst_exit, "getsockopt(SCTP_DEFAULT_SEND_PARAM) " "mismatch."); /* Get default send parameters on the connected TCP-style socket. */ memset(&get_tcp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); optlen = sizeof(get_tcp_sk_dflt_param); test_getsockopt(tcp_clt_sk, SCTP_DEFAULT_SEND_PARAM, &get_tcp_sk_dflt_param, &optlen); /* Verify that the get parameters returned matches the set param * set for the association, not the socket-wide param. */ if ((get_tcp_sk_dflt_param.sinfo_ppid == set_tcp_sk_dflt_param.sinfo_ppid) || (get_tcp_sk_dflt_param.sinfo_ppid != set_tcp_assoc_dflt_param.sinfo_ppid)) tst_brkm(TBROK, tst_exit, "getsockopt(SCTP_DEFAULT_SEND_PARAM) " "mismatch."); /* Get default send parameters on the listening TCP-style socket. */ memset(&get_tcp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); optlen = sizeof(get_tcp_sk_dflt_param); test_getsockopt(tcp_svr_sk, SCTP_DEFAULT_SEND_PARAM, &get_tcp_sk_dflt_param, &optlen); /* Verify that the get parameters returned matches the socket-wide * set param. */ if (get_tcp_sk_dflt_param.sinfo_ppid != set_tcp_sk_dflt_param.sinfo_ppid) tst_brkm(TBROK, tst_exit, "getsockopt(SCTP_DEFAULT_SEND_PARAM) " "mismatch."); tst_resm(TPASS, "getsockopt(SCTP_DEFAULT_SEND_PARAM) - " "one-to-one style assoc"); accept_sk = test_accept(tcp_svr_sk, NULL, &addrlen); /* Get default send parameters of an association on the accepted * TCP-style socket. */ memset(&get_accept_assoc_dflt_param, 0, sizeof(struct sctp_sndrcvinfo)); optlen = sizeof(get_accept_assoc_dflt_param); test_getsockopt(accept_sk, SCTP_DEFAULT_SEND_PARAM, &get_accept_assoc_dflt_param, &optlen); error = 0; /* Verify that the get parameters returned matches the socket-wide * set param. */ if (get_tcp_sk_dflt_param.sinfo_ppid != set_tcp_sk_dflt_param.sinfo_ppid) tst_brkm(TBROK, tst_exit, "getsockopt(SCTP_DEFAULT_SEND_PARAM) " "mismatch."); tst_resm(TPASS, "getsockopt(SCTP_DEFAULT_SEND_PARAM) - " "one-to-one style accepted socket"); /* TEST #7: SCTP_GET_PEER_ADDR_INFO socket option. */ /* Try 0 associd and 0 addr */ memset(&pinfo, 0, sizeof(pinfo)); optlen = sizeof(pinfo); error = getsockopt(udp_clt_sk, SOL_SCTP, SCTP_GET_PEER_ADDR_INFO, &pinfo, &optlen); if ((-1 != error) || (EINVAL != errno)) tst_brkm(TBROK, tst_exit, "getsockopt(SCTP_GET_PEER_ADDR_INFO) " "null associd, null addr error:%d, errno:%d\n", error, errno); tst_resm(TPASS, "getsockopt(SCTP_GET_PEER_ADDR_INFO) - " "null associd and null addr"); /* Try valid associd, but 0 addr */ memset(&pinfo, 0, sizeof(pinfo)); optlen = sizeof(pinfo); pinfo.spinfo_assoc_id = udp_clt_associd; error = getsockopt(udp_clt_sk, SOL_SCTP, SCTP_GET_PEER_ADDR_INFO, &pinfo, &optlen); if ((-1 != error) || (EINVAL != errno)) tst_brkm(TBROK, tst_exit, "getsockopt(SCTP_GET_PEER_ADDR_INFO) " "valid associd, null addr error:%d, errno:%d\n", error, errno); tst_resm(TPASS, "getsockopt(SCTP_GET_PEER_ADDR_INFO) - " "valid associd and null addr"); /* Try valid associd, invalid addr */ memset(&pinfo, 0, sizeof(pinfo)); optlen = sizeof(pinfo); pinfo.spinfo_assoc_id = udp_clt_associd; memcpy(&pinfo.spinfo_address, &udp_clt_loop, sizeof(udp_clt_loop)); error = getsockopt(udp_clt_sk, SOL_SCTP, SCTP_GET_PEER_ADDR_INFO, &pinfo, &optlen); if ((-1 != error) || (EINVAL != errno)) tst_brkm(TBROK, tst_exit, "getsockopt(SCTP_GET_PEER_ADDR_INFO) " "valid associd, invalid addr error:%d, errno:%d\n", error, errno); tst_resm(TPASS, "getsockopt(SCTP_GET_PEER_ADDR_INFO) - " "valid associd and invalid addr"); /* Try valid associd, valid addr */ memset(&pinfo, 0, sizeof(pinfo)); optlen = sizeof(pinfo); pinfo.spinfo_assoc_id = udp_clt_associd; memcpy(&pinfo.spinfo_address, &udp_svr_loop, sizeof(udp_svr_loop)); test_getsockopt(udp_clt_sk, SCTP_GET_PEER_ADDR_INFO, &pinfo, &optlen); tst_resm(TPASS, "getsockopt(SCTP_GET_PEER_ADDR_INFO) - " "valid associd and valid addr"); /* Try valid addr, peeled off socket */ memset(&pinfo, 0, sizeof(pinfo)); optlen = sizeof(pinfo); pinfo.spinfo_assoc_id = 0; memcpy(&pinfo.spinfo_address, &udp_clt_loop, sizeof(udp_clt_loop)); test_getsockopt(peeloff_sk, SCTP_GET_PEER_ADDR_INFO, &pinfo, &optlen); tst_resm(TPASS, "getsockopt(SCTP_GET_PEER_ADDR_INFO) - " "valid associd and valid addr peeled off socket"); /* Try valid addr, TCP-style accept socket */ memset(&pinfo, 0, sizeof(pinfo)); optlen = sizeof(pinfo); pinfo.spinfo_assoc_id = 0; memcpy(&pinfo.spinfo_address, &tcp_clt_loop, sizeof(tcp_clt_loop)); error = test_getsockopt(accept_sk, SCTP_GET_PEER_ADDR_INFO, &pinfo, &optlen); tst_resm(TPASS, "getsockopt(SCTP_GET_PEER_ADDR_INFO) - " "valid associd and valid addr accepted socket"); close(udp_svr_sk); close(udp_clt_sk); close(tcp_svr_sk); close(tcp_clt_sk); close(accept_sk); close(peeloff_sk); /* Indicate successful completion. */ return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -