More ticket #950 (QoS):
 - fixed wrong DSCP field operation with sock_qos_bsd.c backend
 - tested on Linux for SIP (UDP/TCP), UDP RTP/RTCP, and ICE
 - renamed 801_1_P names to SO_PRIO
 - changed a bit of doxygen documentation (the title etc)


git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@2967 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjlib/include/pj/sock_qos.h b/pjlib/include/pj/sock_qos.h
index 12dd4b8..00d29e9 100644
--- a/pjlib/include/pj/sock_qos.h
+++ b/pjlib/include/pj/sock_qos.h
@@ -31,7 +31,7 @@
 
 
 /**
- * @defgroup socket_qos Socket Quality of Service (QoS) API
+ * @defgroup socket_qos Socket Quality of Service (QoS) API: TOS, DSCP, WMM, IEEE 802.1p
  * @ingroup PJ_SOCK
  * @{
 
@@ -63,7 +63,7 @@
 
     At the Internet layer, you can use Differentiated Services/Diffserv and
     set the value of the Differentiated Services Code Point (DSCP) in the 
-    IP header. As defined in RFC 2472, the DSCP value is the high-order 6 bits
+    IP header. As defined in RFC 2474, the DSCP value is the high-order 6 bits
     of the IP version 4 (IPv4) TOS field and the IP version 6 (IPv6) Traffic 
     Class field.
 
@@ -179,7 +179,7 @@
      typedef enum pj_qos_flag
      {
 	PJ_QOS_PARAM_HAS_DSCP = 1,
-	PJ_QOS_PARAM_HAS_802_1_P = 2,
+	PJ_QOS_PARAM_HAS_SO_PRIO = 2,
 	PJ_QOS_PARAM_HAS_WMM = 4
      } pj_qos_flag;
 
@@ -195,7 +195,7 @@
      {
 	pj_uint8_t      flags;    // Determines which values to 
 				  // set, bitmask of pj_qos_flag
-	pj_uint8_t      dscp_val; // DSCP value to set
+	pj_uint8_t      dscp_val; // The 6 bits DSCP value to set
 	pj_uint8_t      so_prio;  // SO_PRIORITY value
 	pj_qos_wmm_prio wmm_prio; // WMM priority value
      } pj_qos_params;
@@ -248,7 +248,7 @@
 typedef enum pj_qos_flag
 {
     PJ_QOS_PARAM_HAS_DSCP = 1,	    /**< DSCP field is set.	    */
-    PJ_QOS_PARAM_HAS_802_1_P = 2,   /**< IEEE 802.1p  field is set  */
+    PJ_QOS_PARAM_HAS_SO_PRIO = 2,   /**< Socket SO_PRIORITY	    */
     PJ_QOS_PARAM_HAS_WMM = 4	    /**< WMM  field is set. 	    */
 } pj_qos_flag;
 
@@ -272,7 +272,7 @@
 {
     pj_uint8_t      flags;    /**< Determines which values to 
 				   set, bitmask of pj_qos_flag	    */
-    pj_uint8_t      dscp_val; /**< DSCP value to set		    */
+    pj_uint8_t      dscp_val; /**< The 6 bits DSCP value to set	    */
     pj_uint8_t      so_prio;  /**< SO_PRIORITY value		    */
     pj_qos_wmm_prio wmm_prio; /**< WMM priority value		    */
 } pj_qos_params;
diff --git a/pjlib/src/pj/sock_qos_bsd.c b/pjlib/src/pj/sock_qos_bsd.c
index 32b2828..fbd7335 100644
--- a/pjlib/src/pj/sock_qos_bsd.c
+++ b/pjlib/src/pj/sock_qos_bsd.c
@@ -41,7 +41,8 @@
 
     /* Set TOS/DSCP */
     if (param->flags & PJ_QOS_PARAM_HAS_DSCP) {
-	int val = param->dscp_val;
+	/* Value is dscp_val << 2 */
+	int val = (param->dscp_val << 2);
 	status = pj_sock_setsockopt(sock, pj_SOL_IP(), pj_IP_TOS(), 
 				    &val, sizeof(val));
 	if (status != PJ_SUCCESS) {
@@ -51,12 +52,12 @@
     }
 
     /* Set SO_PRIORITY */
-    if (param->flags & PJ_QOS_PARAM_HAS_802_1_P) {
+    if (param->flags & PJ_QOS_PARAM_HAS_SO_PRIO) {
 	int val = param->so_prio;
 	status = pj_sock_setsockopt(sock, pj_SOL_SOCKET(), pj_SO_PRIORITY(),
 				    &val, sizeof(val));
 	if (status != PJ_SUCCESS) {
-	    param->flags &= ~(PJ_QOS_PARAM_HAS_802_1_P);
+	    param->flags &= ~(PJ_QOS_PARAM_HAS_SO_PRIO);
 	    last_err = status;
 	}
     }
@@ -93,7 +94,7 @@
 				&val, &optlen);
     if (status == PJ_SUCCESS) {
 	p_param->flags |= PJ_QOS_PARAM_HAS_DSCP;
-	p_param->dscp_val = (pj_uint8_t)val;
+	p_param->dscp_val = (pj_uint8_t)(val >> 2);
     } else {
 	last_err = status;
     }
@@ -103,7 +104,7 @@
     status = pj_sock_getsockopt(sock, pj_SOL_SOCKET(), pj_SO_PRIORITY(),
 				&val, &optlen);
     if (status == PJ_SUCCESS) {
-	p_param->flags |= PJ_QOS_PARAM_HAS_802_1_P;
+	p_param->flags |= PJ_QOS_PARAM_HAS_SO_PRIO;
 	p_param->so_prio = (pj_uint8_t)val;
     } else {
 	last_err = status;
@@ -128,3 +129,4 @@
 }
 
 #endif	/* PJ_QOS_IMPLEMENTATION */
+
diff --git a/pjlib/src/pj/sock_qos_common.c b/pjlib/src/pj/sock_qos_common.c
index a59b606..27ccf09 100644
--- a/pjlib/src/pj/sock_qos_common.c
+++ b/pjlib/src/pj/sock_qos_common.c
@@ -23,7 +23,7 @@
 #include <pj/string.h>
 
 #define THIS_FILE   "sock_qos_common.c"
-#define ALL_FLAGS   (PJ_QOS_PARAM_HAS_DSCP | PJ_QOS_PARAM_HAS_802_1_P | \
+#define ALL_FLAGS   (PJ_QOS_PARAM_HAS_DSCP | PJ_QOS_PARAM_HAS_SO_PRIO | \
                      PJ_QOS_PARAM_HAS_WMM)
 
 /* "Standard" mapping between traffic type and QoS params */
@@ -66,7 +66,7 @@
 	++count;
     }
 
-    if (param->flags & PJ_QOS_PARAM_HAS_802_1_P) {
+    if (param->flags & PJ_QOS_PARAM_HAS_SO_PRIO) {
 	for (i=0; i<=PJ_QOS_TYPE_CONTROL; ++i) {
 	    if (param->so_prio >= qos_map[i].so_prio)
 		prio_type = (pj_qos_type)i;
diff --git a/pjlib/src/pj/sock_qos_symbian.cpp b/pjlib/src/pj/sock_qos_symbian.cpp
index 59912ec..f9e3c3d 100644
--- a/pjlib/src/pj/sock_qos_symbian.cpp
+++ b/pjlib/src/pj/sock_qos_symbian.cpp
@@ -27,7 +27,7 @@
     pj_status_t last_err = PJ_ENOTSUP;
     
     /* SO_PRIORITY and WMM are not supported */
-    param->flags &= ~(PJ_QOS_PARAM_HAS_802_1_P | PJ_QOS_PARAM_HAS_WMM);
+    param->flags &= ~(PJ_QOS_PARAM_HAS_SO_PRIO | PJ_QOS_PARAM_HAS_WMM);
     
     if (param->flags & PJ_QOS_PARAM_HAS_DSCP) {
 	TInt err;