Ignore:
Timestamp:
Oct 5, 2016 9:07:17 AM (5 years ago)
Author:
riza
Message:

Re #1963: Implement QoS for IPv6 for platform that supports IPV6_TCLASS.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib/src/pj/sock_qos_bsd.c

    r3553 r5444  
    2323 
    2424/* This is the implementation of QoS with BSD socket's setsockopt(), 
    25  * using IP_TOS and SO_PRIORITY 
     25 * using IP_TOS/IPV6_TCLASS and SO_PRIORITY 
    2626 */  
    2727#if !defined(PJ_QOS_IMPLEMENTATION) || PJ_QOS_IMPLEMENTATION==PJ_QOS_BSD 
     
    4242    /* Set TOS/DSCP */ 
    4343    if (param->flags & PJ_QOS_PARAM_HAS_DSCP) { 
     44        /* We need to know if the socket is IPv4 or IPv6 */ 
     45        pj_sockaddr sa; 
     46        int salen = sizeof(salen); 
     47 
    4448        /* Value is dscp_val << 2 */ 
    4549        int val = (param->dscp_val << 2); 
    46         status = pj_sock_setsockopt(sock, pj_SOL_IP(), pj_IP_TOS(),  
    47                                     &val, sizeof(val)); 
     50 
     51        status = pj_sock_getsockname(sock, &sa, &salen); 
     52        if (status != PJ_SUCCESS) 
     53            return status; 
     54 
     55        if (sa.addr.sa_family == pj_AF_INET()) { 
     56            /* In IPv4, the DS field goes in the TOS field */ 
     57            status = pj_sock_setsockopt(sock, pj_SOL_IP(), pj_IP_TOS(),  
     58                                        &val, sizeof(val)); 
     59        } else if (sa.addr.sa_family == pj_AF_INET6()) { 
     60            /* In IPv6, the DS field goes in the Traffic Class field */ 
     61            status = pj_sock_setsockopt(sock, pj_SOL_IPV6(), 
     62                                        pj_IPV6_TCLASS(), 
     63                                        &val, sizeof(val)); 
     64        } else { 
     65            status = PJ_EINVAL; 
     66        } 
     67 
    4868        if (status != PJ_SUCCESS) { 
    4969            param->flags &= ~(PJ_QOS_PARAM_HAS_DSCP); 
     
    85105    pj_status_t last_err = PJ_ENOTSUP; 
    86106    int val, optlen; 
     107    pj_sockaddr sa; 
     108    int salen = sizeof(salen); 
    87109    pj_status_t status; 
    88110 
     
    90112 
    91113    /* Get DSCP/TOS value */ 
    92     optlen = sizeof(val); 
    93     status = pj_sock_getsockopt(sock, pj_SOL_IP(), pj_IP_TOS(),  
    94                                 &val, &optlen); 
     114    status = pj_sock_getsockname(sock, &sa, &salen); 
    95115    if (status == PJ_SUCCESS) { 
    96         p_param->flags |= PJ_QOS_PARAM_HAS_DSCP; 
    97         p_param->dscp_val = (pj_uint8_t)(val >> 2); 
     116        optlen = sizeof(val); 
     117        if (sa.addr.sa_family == pj_AF_INET()) { 
     118            status = pj_sock_getsockopt(sock, pj_SOL_IP(), pj_IP_TOS(),  
     119                                        &val, &optlen); 
     120        } else if (sa.addr.sa_family == pj_AF_INET6()) { 
     121            status = pj_sock_getsockopt(sock, pj_SOL_IPV6(), 
     122                                        pj_IPV6_TCLASS(), 
     123                                        &val, &optlen); 
     124        } else { 
     125            status = PJ_EINVAL; 
     126        } 
     127 
     128        if (status == PJ_SUCCESS) { 
     129            p_param->flags |= PJ_QOS_PARAM_HAS_DSCP; 
     130            p_param->dscp_val = (pj_uint8_t)(val >> 2); 
     131        } else { 
     132            last_err = status; 
     133        } 
    98134    } else { 
    99135        last_err = status; 
Note: See TracChangeset for help on using the changeset viewer.