@@ -1135,6 +1135,8 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
11351135 {"version6" , no_argument , NULL , '6' },
11361136 {"tos" , required_argument , NULL , 'S' },
11371137 {"dscp" , required_argument , NULL , OPT_DSCP },
1138+ {"control-tos" , required_argument , NULL , OPT_CONTROL_TOS },
1139+ {"control-dscp" , required_argument , NULL , OPT_CONTROL_DSCP },
11381140 {"extra-data" , required_argument , NULL , OPT_EXTRA_DATA },
11391141#if defined(HAVE_FLOWLABEL )
11401142 {"flowlabel" , required_argument , NULL , 'L' },
@@ -1505,6 +1507,22 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
15051507 }
15061508 client_flag = 1 ;
15071509 break ;
1510+ case OPT_CONTROL_TOS :
1511+ test -> settings -> ctrl_tos = strtol (optarg , & endptr , 0 );
1512+ if (endptr == optarg ||
1513+ test -> settings -> ctrl_tos < 0 ||
1514+ test -> settings -> ctrl_tos > 255 ) {
1515+ i_errno = IEBADTOS ;
1516+ return -1 ;
1517+ }
1518+ break ;
1519+ case OPT_CONTROL_DSCP :
1520+ test -> settings -> ctrl_tos = parse_qos (optarg );
1521+ if (test -> settings -> ctrl_tos < 0 ) {
1522+ i_errno = IEBADTOS ;
1523+ return -1 ;
1524+ }
1525+ break ;
15081526 case OPT_EXTRA_DATA :
15091527 test -> extra_data = strdup (optarg );
15101528 client_flag = 1 ;
@@ -5487,6 +5505,34 @@ iflush(struct iperf_test *test)
54875505 return rc2 ;
54885506}
54895507
5508+ int
5509+ iperf_set_tos (int s , int tos )
5510+ {
5511+ if (tos ) {
5512+ if (getsockdomain (s ) == AF_INET6 ) {
5513+ #ifdef IPV6_TCLASS
5514+ if (setsockopt (s , IPPROTO_IPV6 , IPV6_TCLASS , & tos , sizeof (tos )) < 0 ) {
5515+ i_errno = IESETCOS ;
5516+ return -1 ;
5517+ }
5518+ if (setsockopt (s , IPPROTO_IP , IP_TOS , & tos , sizeof (tos )) < 0 ) {
5519+ /* ignore any failure of v4 TOS in IPv6 case */
5520+ }
5521+ #else
5522+ i_errno = IESETCOS ;
5523+ return -1 ;
5524+ #endif
5525+ } else {
5526+ if (setsockopt (s , IPPROTO_IP , IP_TOS , & tos , sizeof (tos )) < 0 ) {
5527+ i_errno = IESETTOS ;
5528+ return -1 ;
5529+ }
5530+ }
5531+ }
5532+
5533+ return 0 ;
5534+ }
5535+
54905536#if defined (HAVE_TCP_KEEPALIVE )
54915537// Set Control Connection TCP Keepalive (especially useful for long UDP test sessions)
54925538int
0 commit comments