]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Set TCLASS field of IPv6 header when sip qos options are set.
authorDavid Vossel <dvossel@digium.com>
Thu, 14 Oct 2010 22:09:32 +0000 (22:09 +0000)
committerDavid Vossel <dvossel@digium.com>
Thu, 14 Oct 2010 22:09:32 +0000 (22:09 +0000)
(closes issue #18099)
Reported by: jamesnet
Patches:
      issues_18099_v2.diff uploaded by dvossel (license 671)
Tested by: dvossel, jamesnet

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@291829 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/netsock2.c

index 99f7eac89d2d185b42839aa83861a8b1a0b8318b..ed5964db8ae40a357f9229e92173496d8fca8d47 100644 (file)
@@ -454,8 +454,17 @@ ssize_t ast_sendto(int sockfd, const void *buf, size_t len, int flags,
 int ast_set_qos(int sockfd, int tos, int cos, const char *desc)
 {
        int res;
+       int proto_type = IPPROTO_IP; /* ipv4 values by default */
+       int dscp_field = IP_TOS;
+       struct ast_sockaddr addr;
 
-       if ((res = setsockopt(sockfd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)))) {
+       /* if this is IPv6 we need to set the TCLASS instead of TOS */
+       if (!ast_getsockname(sockfd, &addr) && ast_sockaddr_is_ipv6(&addr)) {
+               proto_type = IPPROTO_IPV6;
+               dscp_field = IPV6_TCLASS;
+       }
+
+       if ((res = setsockopt(sockfd, proto_type, dscp_field, &tos, sizeof(tos)))) {
                ast_log(LOG_WARNING, "Unable to set %s TOS to %d (may be you have no "
                        "root privileges): %s\n", desc, tos, strerror(errno));
        } else if (tos) {