⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_sockopt.c

📁 SCTP 协议实现源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
        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 + -