16f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu/* SCTP kernel Implementation
25ba96af16cf74736f632baec4672dda40c441682mridge * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
35ba96af16cf74736f632baec4672dda40c441682mridge * (C) Copyright IBM Corp. 2004
45ba96af16cf74736f632baec4672dda40c441682mridge *
55ba96af16cf74736f632baec4672dda40c441682mridge * This file has test cases to test the getsockopt () and sectsockopt () with
65ba96af16cf74736f632baec4672dda40c441682mridge * SCTP_RTOINFO option on 1-1 style socket
75ba96af16cf74736f632baec4672dda40c441682mridge *
85ba96af16cf74736f632baec4672dda40c441682mridge * This program first gets the default values using getsockopt(). It also sets
95ba96af16cf74736f632baec4672dda40c441682mridge * the value using setsockopt() and gets the set value using getsockopt().
105ba96af16cf74736f632baec4672dda40c441682mridge * A comparison between set values and get values are performed.
115ba96af16cf74736f632baec4672dda40c441682mridge *
126f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu * The SCTP implementation is free software;
135ba96af16cf74736f632baec4672dda40c441682mridge * you can redistribute it and/or modify it under the terms of
145ba96af16cf74736f632baec4672dda40c441682mridge * the GNU General Public License as published by
155ba96af16cf74736f632baec4672dda40c441682mridge * the Free Software Foundation; either version 2, or (at your option)
165ba96af16cf74736f632baec4672dda40c441682mridge * any later version.
175ba96af16cf74736f632baec4672dda40c441682mridge *
186f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu * The SCTP implementation is distributed in the hope that it
195ba96af16cf74736f632baec4672dda40c441682mridge * will be useful, but WITHOUT ANY WARRANTY; without even the implied
205ba96af16cf74736f632baec4672dda40c441682mridge *                 ************************
215ba96af16cf74736f632baec4672dda40c441682mridge * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
225ba96af16cf74736f632baec4672dda40c441682mridge * See the GNU General Public License for more details.
235ba96af16cf74736f632baec4672dda40c441682mridge *
245ba96af16cf74736f632baec4672dda40c441682mridge * You should have received a copy of the GNU General Public License
255ba96af16cf74736f632baec4672dda40c441682mridge * along with GNU CC; see the file COPYING.  If not, write to
265ba96af16cf74736f632baec4672dda40c441682mridge * the Free Software Foundation, 59 Temple Place - Suite 330,
275ba96af16cf74736f632baec4672dda40c441682mridge * Boston, MA 02111-1307, USA.
285ba96af16cf74736f632baec4672dda40c441682mridge *
295ba96af16cf74736f632baec4672dda40c441682mridge * Please send any bug reports or fixes you make to the
305ba96af16cf74736f632baec4672dda40c441682mridge * email address(es):
315ba96af16cf74736f632baec4672dda40c441682mridge *    lksctp developers <lksctp-developers@lists.sourceforge.net>
325ba96af16cf74736f632baec4672dda40c441682mridge *
335ba96af16cf74736f632baec4672dda40c441682mridge * Or submit a bug report through the following website:
345ba96af16cf74736f632baec4672dda40c441682mridge *    http://www.sf.net/projects/lksctp
355ba96af16cf74736f632baec4672dda40c441682mridge *
365ba96af16cf74736f632baec4672dda40c441682mridge * Any bugs reported given to us we will try to fix... any fixes shared will
375ba96af16cf74736f632baec4672dda40c441682mridge * be incorporated into the next SCTP release
385ba96af16cf74736f632baec4672dda40c441682mridge *
395ba96af16cf74736f632baec4672dda40c441682mridge */
405ba96af16cf74736f632baec4672dda40c441682mridge
415ba96af16cf74736f632baec4672dda40c441682mridge#include <stdio.h>
425ba96af16cf74736f632baec4672dda40c441682mridge#include <unistd.h>
435ba96af16cf74736f632baec4672dda40c441682mridge#include <fcntl.h>
445ba96af16cf74736f632baec4672dda40c441682mridge#include <stdlib.h>
455ba96af16cf74736f632baec4672dda40c441682mridge#include <string.h>
465ba96af16cf74736f632baec4672dda40c441682mridge#include <sys/types.h>
475ba96af16cf74736f632baec4672dda40c441682mridge#include <sys/socket.h>
4864a341fc42c967890a9fb5d8855568e23104bef6mridge#include <linux/socket.h>
496f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu#include <linux/in.h>         /* for sockaddr_in */
506f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu#include <linux/in6.h>         /* for sockaddr_in6 */
516f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu#include <sys/errno.h>
525ba96af16cf74736f632baec4672dda40c441682mridge#include <sys/uio.h>
535ba96af16cf74736f632baec4672dda40c441682mridge#include <netinet/sctp.h>
545ba96af16cf74736f632baec4672dda40c441682mridge#include <sctputil.h>
555ba96af16cf74736f632baec4672dda40c441682mridge
565ba96af16cf74736f632baec4672dda40c441682mridgechar *TCID = __FILE__;
575ba96af16cf74736f632baec4672dda40c441682mridgeint TST_TOTAL = 3;
585ba96af16cf74736f632baec4672dda40c441682mridgeint TST_CNT = 0;
595ba96af16cf74736f632baec4672dda40c441682mridge
606f22494d19b605ded308dc0fa713e91cb873f44aSimon Xuint
616f22494d19b605ded308dc0fa713e91cb873f44aSimon Xumain(void)
625ba96af16cf74736f632baec4672dda40c441682mridge{
636f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu
6464a341fc42c967890a9fb5d8855568e23104bef6mridge	int sd, ret;
6564a341fc42c967890a9fb5d8855568e23104bef6mridge	socklen_t len;
666f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	struct sctp_rtoinfo srtoinfo; /*setting the variables*/
676f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	struct sctp_rtoinfo grtoinfo; /*Getting the variables*/
685ba96af16cf74736f632baec4672dda40c441682mridge
696f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	sd = test_socket (PF_INET, SOCK_STREAM, IPPROTO_SCTP);
705ba96af16cf74736f632baec4672dda40c441682mridge
7164a341fc42c967890a9fb5d8855568e23104bef6mridge	len = sizeof(struct sctp_rtoinfo);
726f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu
736f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*TEST1 Getting the default values using getsockopt()*/
7464a341fc42c967890a9fb5d8855568e23104bef6mridge	ret = getsockopt(sd, IPPROTO_SCTP, SCTP_RTOINFO, &grtoinfo, &len);
755ba96af16cf74736f632baec4672dda40c441682mridge	if (ret < 0)
766f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "getsockopt SCTP_RTOINFO "
775ba96af16cf74736f632baec4672dda40c441682mridge			 "ret:%d, errno:%d", ret, errno);
785ba96af16cf74736f632baec4672dda40c441682mridge
795ba96af16cf74736f632baec4672dda40c441682mridge	tst_resm(TPASS, "getsockopt() SCTP_RTOINFO - SUCCESS");
805ba96af16cf74736f632baec4672dda40c441682mridge
816f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*Assigning the values to RTO initial and max and min bounds*/
826f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	srtoinfo.srto_initial=60;
836f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	srtoinfo.srto_max=100;
846f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	srtoinfo.srto_min=40;
855ba96af16cf74736f632baec4672dda40c441682mridge
866f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*TEST2 Setting the values using setsockopt()*/
876f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	ret = setsockopt(sd, IPPROTO_SCTP, SCTP_RTOINFO, &srtoinfo,
886f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		sizeof(struct sctp_rtoinfo));
895ba96af16cf74736f632baec4672dda40c441682mridge	if (ret < 0)
906f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "setsockopt SCTP_RTOINFO "
915ba96af16cf74736f632baec4672dda40c441682mridge			 "ret:%d, errno:%d", ret, errno);
925ba96af16cf74736f632baec4672dda40c441682mridge
935ba96af16cf74736f632baec4672dda40c441682mridge	tst_resm(TPASS, "setsockopt() SCTP_RTOINFO - SUCCESS");
945ba96af16cf74736f632baec4672dda40c441682mridge
956f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*Getting the values which are set using setsockopt()*/
9664a341fc42c967890a9fb5d8855568e23104bef6mridge	ret = getsockopt(sd, IPPROTO_SCTP, SCTP_RTOINFO, &grtoinfo, &len);
975ba96af16cf74736f632baec4672dda40c441682mridge	if (ret < 0)
986f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "getsockopt SCTP_RTOINFO "
995ba96af16cf74736f632baec4672dda40c441682mridge			 "ret:%d, errno:%d", ret, errno);
1005ba96af16cf74736f632baec4672dda40c441682mridge
1016f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/* TEST3 Compare the get values with the set values. */
1025ba96af16cf74736f632baec4672dda40c441682mridge	if (srtoinfo.srto_initial != grtoinfo.srto_initial &&
1036f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu            srtoinfo.srto_max != grtoinfo.srto_max &&
1046f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu            srtoinfo.srto_min != grtoinfo.srto_min)
1056f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "setsockopt/getsockopt SCTP_RTOINFO "
1065ba96af16cf74736f632baec4672dda40c441682mridge			 "compare failed");
1075ba96af16cf74736f632baec4672dda40c441682mridge
1085ba96af16cf74736f632baec4672dda40c441682mridge	tst_resm(TPASS, "setsockopt()/getsockopt SCTP_RTOINFO compare - "
1095ba96af16cf74736f632baec4672dda40c441682mridge		 "SUCCESS");
1105ba96af16cf74736f632baec4672dda40c441682mridge
1115ba96af16cf74736f632baec4672dda40c441682mridge	close(sd);
1125ba96af16cf74736f632baec4672dda40c441682mridge
1136f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	return 0;
114ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
115