mirror of
https://github.com/openvswitch/ovs
synced 2025-08-31 06:15:47 +00:00
socket-util: Fix set_dscp for IPv6
Try IPPROTO_IPV6/IPV6_TCLASS socket option as well as IPPROTO_IP/IP_TOS so that this can work for IPv6 sockets. IPPROTO_IP/IP_TOS socket option is, as it's SOL indicates, for IPv4. What happens when it's used for IPv6 sockets? On Linux, it seems to be forwarded to IPv4 code and affects IPv4 part of the socket. (e.g. non-V6ONLY case) But it doesn't seem to be the intention of this function. On other platforms including NetBSD, it just fails with ENOPROTOOPT. Probably this function should take the address family but passing it around lib/*stream*.c would be a bigger change. Cc: Arun Sharma <arun.sharma@calsoftinc.com> Signed-off-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp> Signed-off-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
committed by
Ben Pfaff
parent
9a9808d795
commit
92ae5930c2
@@ -108,14 +108,31 @@ int
|
||||
set_dscp(int fd, uint8_t dscp)
|
||||
{
|
||||
int val;
|
||||
bool success;
|
||||
|
||||
if (dscp > 63) {
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
/* Note: this function is used for both of IPv4 and IPv6 sockets */
|
||||
success = false;
|
||||
val = dscp << 2;
|
||||
if (setsockopt(fd, IPPROTO_IP, IP_TOS, &val, sizeof val)) {
|
||||
return sock_errno();
|
||||
if (sock_errno() != ENOPROTOOPT) {
|
||||
return sock_errno();
|
||||
}
|
||||
} else {
|
||||
success = true;
|
||||
}
|
||||
if (setsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS, &val, sizeof val)) {
|
||||
if (sock_errno() != ENOPROTOOPT) {
|
||||
return sock_errno();
|
||||
}
|
||||
} else {
|
||||
success = true;
|
||||
}
|
||||
if (!success) {
|
||||
return ENOPROTOOPT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user