 README
==========
==========


This document explains the revised QOS implementation for PTLIB and openh323.

============
Update 25.4.05:
802.1p/q is now supported natively however is disabled 
To enable set the Static PUDPSocket::disableQoS = PFalse;

QoS support is now negotiated between the calling parties
and will only functions when both parties have.
1. Enabled QoS within Openh323 (as above)
2. Window XP OS
3. Managed NIC with 802.1p enabled.(May have to Set Manually)

============

Contents:

1) Setting a QOS specification in openh323
2) Diffserv support
3) 802.1Q support
4) Windows 2000 issues
5) Windows XP and Server 2003 issues

1) Setting a QOS specification in openh323
==========================================

The basic approach is as follows:

****

RTP_QOS * rtpqos = new RTP_QOS;
rtpqos->dataQoS.SetWinServiceType(DWORD winServiceType);
rtpqos->dataQoS.SetAvgBytesPerSec(DWORD avgBytesPerSec);
rtpqos->dataQoS.SetMaxFrameBytes(DWORD maxFrameBytes);
rtpqos->dataQoS.SetPeakBytesPerSec(DWORD peakBytesPerSec);
rtpqos->dataQoS.SetDSCP(int DSCPvalue);

[If desired:
rtpqos->controlQoS.SetWinServiceType(...)
etc.]

H323Capability * cap = new xxxxx;
cap->AttachQoS(rtpqos);

SetCapability(....);

****

Notes:

i) winServiceType is either SERVICETYPE_GUARANTEED,
SERVICETYPE_CONTROLLEDLOAD, SERVICETYPE_BESTEFFORT, or
SERVICETYPE_PNOTSPECIFIED

ii) for Windows XP or Windows Server 2003, if setting aaaaa as
SERVICETYPE_GUARANTEED or SERVICETYPE_CONTROLLEDLOAD then avgBytesPerSec,
maxFrameBytes, and peakBytesPerSec MUST be set to appropriate values

iii) Calling SetDSCP(DSCPvalue) has no effect on Windows XP or Windows Server
2003 but on other platforms (earlier versions of Windows, and Linux) it will
set the DSCP directly. SetDSCP(-1) clears the effect of any previous call to
SetDSCP()

iv) on platforms other than WinXP or Windows Server 2003, if SetDSCP(...) is
not called but SetWinServiceType(...) is, then an appropriate DSCP
substitution will be made. The substitutions can be changed globally by
calling PQoS::SetDSCPAlternative(DWORD winServiceType, UINT DSCP)

v) if an RTP_QOS is not attached to a capability, the
H323Endpoint::rtpIpTypeofService will be used to set IP_TOS but this has no
effect on WinXP or Windows Server 2003 (and see below for notes relating to
Windows 2000)


2) Diffserv support
===================

Setting of DSCP on packets is supported for most Windows and Linux platforms.
The mechanism is platform-dependent:

Windows XP and Windows Server 2003:
-----------------------------------

Based on the parameters passed to PQoS::SetWinServiceType(...),
PQoS::SetAvgBytesPerSec(...), PQoS::SetMaxFrameBytes(...) and
PQoS::SetPeakBytesPerSec(...)

Linux and earlier versions of Windows:
--------------------------------------

Based either on:

a) the parameter passed to PQoS::SetDSCP(...), or
b) the parameter passed to PQoS::SetWinServiceType(...) plus (optionally) the
parameters passed to any calls to PQoS::SetDSCPAlternative(...)

Unsupported Windows versions
----------------------------

Windows ME - setsockopt/IP_TOS appears to be unsupported and it is impossible
to turn off RSVP signalling for GQOS
Windows NT4 without SP4 - there is a known problem using setsockopt/IP_TOS on
unconnected UDP sockets. SP4 solves this problem (see Microsoft KB article
Q196358).


3) 802.1Q support
=================

Where enabled, 802.1Q is supported on Windows XP and Windows Server 2003 based
on the same calls as for Diffserv support on these platforms

A note for developers
---------------------

In principle, it is possible to support 802.1Q on Windows 2000, but this is
not implemented for the following reason.

Currently, Winsock support in openh323 writes to UDP sockets using sendto(...)
on unconnected UDP sockets. As a result, setting QOS using GQOS (which enables
802.1Q) requires that the QUALITYOFSERVICE structure include a QOS_DESTADDR.
QOS_DESTADDR is not supported on Windows 2000.

If anyone wants to rewrite pwlib winsock support to use WSASendTo, or openh323
to use connected UDP sockets, it should then - in principle - be possible to
remove the requirement for QOS_DESTADDR and use the GQOS API on Windows 2000.
However, note the "in principle". This principle has not been tested!


4) Windows 2000 support
=======================

Diffserv support on Windows 2000 is implemented using the traditional
setsockopt(...) approach with an IP_TOS parameter. The reason for using this
approach rather than the GQOS API is explained in the note to section 3 above.

In order to enable the use of setsockopt(...) with IP_TOS on Windows 2000, it
is necessary to set the following registry setting (unset by default):

HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\DisableUserTOSSetting
= 0

After setting this, you will need to reboot the machine.

A note for those horrified by this
----------------------------------

Unfortunately, even if someone does enable the use of GQOS on Windows 2000, it
will still be necessary to make a non-default registry setting. This is
because by default, Windows 2000 implements RSVP (ie intserv rather than
diffserv). On the grounds that nobody actually uses intserv, PTLIB disables
RSVP in its calls to GQOS, but then to enable diffserv it is necessary to set:

HKLM\System\CurrentControlSet\Services\Qossp\EnablePriorityBoost = 1

Sorry! Blame Microsoft...


5) Windows XP and Server 2003 support
=====================================

The approach used for QOS support on these platforms does not allow the DSCP
or 802.1Q COS to be set directly. However, it should be possible for the
system administrator to modify the DSCP that is used for any of the service
types specified in the call to PQoS::SetWinServiceType(...).

To do this:

* run "mmc"
* go to File\Add/Remove Snap-in
* add the Group Policy object (shows up as Local Computer Policy)
* within Local COmputer Policy, go to:

Computer Configuration\Administrative Templates\Netrwork\QoS Packet Scheduler.

This will allow you to configure DSCP and Layer-2 priority values (802.1Q
COS). Note that only Guaranteed service type, Controlled load service type,
and Best effort service type are supported.
