Skip to content

Commit 829b18c

Browse files
tcp,udp: set TOS (TCLASS) for IPv6 sockets
1 parent a07bc3e commit 829b18c

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

src/tcp/tcp.c

+26-2
Original file line numberDiff line numberDiff line change
@@ -1450,12 +1450,23 @@ int tcp_settos(struct tcp_sock *ts, uint32_t tos)
14501450
{
14511451
int err = 0;
14521452
int v = tos;
1453+
struct sa sa;
14531454

14541455
if (!ts)
14551456
return EINVAL;
14561457

14571458
ts->tos = tos;
1458-
err = tcp_sock_setopt(ts, IPPROTO_IP, IP_TOS, &v, sizeof(v));
1459+
err = tcp_local_get(ts, &sa);
1460+
if (err)
1461+
return err;
1462+
1463+
if (sa_af(&sa) == AF_INET) {
1464+
err = tcp_sock_setopt(ts, IPPROTO_IP, IP_TOS, &v, sizeof(v));
1465+
}
1466+
else if (sa_af(&sa) == AF_INET6) {
1467+
err = tcp_sock_setopt(ts, IPPROTO_IPV6, IPV6_TCLASS, &v,
1468+
sizeof(v));
1469+
}
14591470

14601471
return err;
14611472
}
@@ -1465,16 +1476,29 @@ int tcp_conn_settos(struct tcp_conn *tc, uint32_t tos)
14651476
{
14661477
int err = 0;
14671478
int v = tos;
1479+
struct sa sa;
14681480

14691481
if (!tc)
14701482
return EINVAL;
14711483

14721484
tc->tos = tos;
1473-
if (tc->fdc != RE_BAD_SOCK) {
1485+
if (tc->fdc == RE_BAD_SOCK)
1486+
return err;
1487+
1488+
err = tcp_conn_local_get(tc, &sa);
1489+
if (err)
1490+
return err;
1491+
1492+
if (sa_af(&sa) == AF_INET) {
14741493
if (0 != setsockopt(tc->fdc, IPPROTO_IP, IP_TOS,
14751494
BUF_CAST &v, sizeof(v)))
14761495
err = RE_ERRNO_SOCK;
14771496
}
1497+
else if (sa_af(&sa) == AF_INET6) {
1498+
if (0 != setsockopt(tc->fdc, IPPROTO_IPV6, IPV6_TCLASS,
1499+
BUF_CAST &v, sizeof(v)))
1500+
err = RE_ERRNO_SOCK;
1501+
}
14781502

14791503
return err;
14801504
}

src/udp/udp.c

+13-1
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,7 @@ int udp_settos(struct udp_sock *us, uint8_t tos)
628628
{
629629
int err = 0;
630630
int v = tos;
631+
struct sa sa;
631632
#ifdef WIN32
632633
QOS_VERSION qos_version = { 1 , 0 };
633634
QOS_TRAFFIC_TYPE qos_type = QOSTrafficTypeBestEffort;
@@ -660,7 +661,18 @@ int udp_settos(struct udp_sock *us, uint8_t tos)
660661
return WSAGetLastError();
661662
}
662663
#endif
663-
err = udp_setsockopt(us, IPPROTO_IP, IP_TOS, &v, sizeof(v));
664+
err = udp_local_get(us, &sa);
665+
if (err)
666+
return err;
667+
668+
if (sa_af(&sa) == AF_INET) {
669+
err = udp_setsockopt(us, IPPROTO_IP, IP_TOS, &v, sizeof(v));
670+
}
671+
else if (sa_af(&sa) == AF_INET6) {
672+
err = udp_setsockopt(us, IPPROTO_IPV6, IPV6_TCLASS, &v,
673+
sizeof(v));
674+
}
675+
664676
return err;
665677
}
666678

0 commit comments

Comments
 (0)