| Index: webrtc/voice_engine/test/channel_transport/udp_socket2_win.cc
|
| diff --git a/webrtc/voice_engine/test/channel_transport/udp_socket2_win.cc b/webrtc/voice_engine/test/channel_transport/udp_socket2_win.cc
|
| index ffe71390935b17ed107c32920eccb5a75792814e..07080cfd27832ea2f768e22c899d21480e1f9e0a 100644
|
| --- a/webrtc/voice_engine/test/channel_transport/udp_socket2_win.cc
|
| +++ b/webrtc/voice_engine/test/channel_transport/udp_socket2_win.cc
|
| @@ -41,7 +41,8 @@ typedef const QOS_DESTADDR* LPCQOS_DESTADDR;
|
| #define QOS_OBJECT_DESTADDR (0x00000004 + QOS_GENERAL_ID_BASE)
|
|
|
| UdpSocket2Windows::UdpSocket2Windows(const int32_t id,
|
| - UdpSocketManager* mgr, bool ipV6Enable,
|
| + UdpSocketManager* mgr,
|
| + bool ipV6Enable,
|
| bool disableGQOS)
|
| : _id(id),
|
| _qos(true),
|
| @@ -52,129 +53,105 @@ UdpSocket2Windows::UdpSocket2Windows(const int32_t id,
|
| _addedToMgr(false),
|
| delete_event_(true, false),
|
| _outstandingCallsDisabled(false),
|
| - _clientHandle(NULL),
|
| - _flowHandle(NULL),
|
| - _filterHandle(NULL),
|
| - _flow(NULL),
|
| - _gtc(NULL),
|
| + _clientHandle(nullptr),
|
| + _flowHandle(nullptr),
|
| + _filterHandle(nullptr),
|
| + _flow(nullptr),
|
| + _gtc(nullptr),
|
| _pcp(-2),
|
| - _receiveBuffers(0)
|
| -{
|
| - WEBRTC_TRACE(kTraceMemory, kTraceTransport, _id,
|
| - "UdpSocket2Windows::UdpSocket2Windows()");
|
| -
|
| - _wantsIncoming = false;
|
| - _mgr = static_cast<UdpSocket2ManagerWindows *>(mgr);
|
| -
|
| - _obj = NULL;
|
| - _incomingCb = NULL;
|
| - _socket = INVALID_SOCKET;
|
| - _ptrCbRWLock = RWLockWrapper::CreateRWLock();
|
| - _ptrDestRWLock = RWLockWrapper::CreateRWLock();
|
| - _ptrSocketRWLock = RWLockWrapper::CreateRWLock();
|
| -
|
| - // Check if QoS is supported.
|
| - BOOL bProtocolFound = FALSE;
|
| - WSAPROTOCOL_INFO *lpProtocolBuf = NULL;
|
| - WSAPROTOCOL_INFO pProtocolInfo;
|
| -
|
| - if(!disableGQOS)
|
| - {
|
| - DWORD dwBufLen = 0;
|
| - // Set dwBufLen to the size needed to retreive all the requested
|
| - // information from WSAEnumProtocols.
|
| - int32_t nRet = WSAEnumProtocols(NULL, lpProtocolBuf, &dwBufLen);
|
| - lpProtocolBuf = (WSAPROTOCOL_INFO*)malloc(dwBufLen);
|
| - nRet = WSAEnumProtocols(NULL, lpProtocolBuf, &dwBufLen);
|
| + _receiveBuffers(0) {
|
| + WEBRTC_TRACE(kTraceMemory, kTraceTransport, _id,
|
| + "UdpSocket2Windows::UdpSocket2Windows()");
|
| +
|
| + _wantsIncoming = false;
|
| + _mgr = static_cast<UdpSocket2ManagerWindows*>(mgr);
|
| +
|
| + _obj = nullptr;
|
| + _incomingCb = nullptr;
|
| + _socket = INVALID_SOCKET;
|
| + _ptrCbRWLock = RWLockWrapper::CreateRWLock();
|
| + _ptrDestRWLock = RWLockWrapper::CreateRWLock();
|
| + _ptrSocketRWLock = RWLockWrapper::CreateRWLock();
|
| +
|
| + // Check if QoS is supported.
|
| + BOOL bProtocolFound = FALSE;
|
| + WSAPROTOCOL_INFO* lpProtocolBuf = nullptr;
|
| + WSAPROTOCOL_INFO pProtocolInfo;
|
| +
|
| + if (!disableGQOS) {
|
| + DWORD dwBufLen = 0;
|
| + // Set dwBufLen to the size needed to retreive all the requested
|
| + // information from WSAEnumProtocols.
|
| + int32_t nRet = WSAEnumProtocols(nullptr, lpProtocolBuf, &dwBufLen);
|
| + lpProtocolBuf = (WSAPROTOCOL_INFO*)malloc(dwBufLen);
|
| + nRet = WSAEnumProtocols(nullptr, lpProtocolBuf, &dwBufLen);
|
| +
|
| + if (ipV6Enable) {
|
| + _iProtocol = AF_INET6;
|
| + } else {
|
| + _iProtocol = AF_INET;
|
| + }
|
|
|
| - if (ipV6Enable)
|
| - {
|
| - _iProtocol=AF_INET6;
|
| - } else {
|
| - _iProtocol=AF_INET;
|
| + for (int32_t i = 0; i < nRet; i++) {
|
| + if (_iProtocol == lpProtocolBuf[i].iAddressFamily &&
|
| + IPPROTO_UDP == lpProtocolBuf[i].iProtocol) {
|
| + if ((XP1_QOS_SUPPORTED ==
|
| + (XP1_QOS_SUPPORTED & lpProtocolBuf[i].dwServiceFlags1))) {
|
| + pProtocolInfo = lpProtocolBuf[i];
|
| + bProtocolFound = TRUE;
|
| + break;
|
| }
|
| -
|
| - for (int32_t i=0; i<nRet; i++)
|
| - {
|
| - if (_iProtocol == lpProtocolBuf[i].iAddressFamily &&
|
| - IPPROTO_UDP == lpProtocolBuf[i].iProtocol)
|
| - {
|
| - if ((XP1_QOS_SUPPORTED ==
|
| - (XP1_QOS_SUPPORTED & lpProtocolBuf[i].dwServiceFlags1)))
|
| - {
|
| - pProtocolInfo = lpProtocolBuf[i];
|
| - bProtocolFound = TRUE;
|
| - break;
|
| - }
|
| - }
|
| - }
|
| + }
|
| }
|
| + }
|
|
|
| - if(!bProtocolFound)
|
| - {
|
| - free(lpProtocolBuf);
|
| - _qos=false;
|
| - WEBRTC_TRACE(
|
| - kTraceError,
|
| - kTraceTransport,
|
| - _id,
|
| - "UdpSocket2Windows::UdpSocket2Windows(), SOCKET_ERROR_NO_QOS,\
|
| + if (!bProtocolFound) {
|
| + free(lpProtocolBuf);
|
| + _qos = false;
|
| + WEBRTC_TRACE(kTraceError, kTraceTransport, _id,
|
| + "UdpSocket2Windows::UdpSocket2Windows(), SOCKET_ERROR_NO_QOS,\
|
| !bProtocolFound");
|
| + } else {
|
| + _socket =
|
| + WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
|
| + &pProtocolInfo, 0, WSA_FLAG_OVERLAPPED);
|
| + free(lpProtocolBuf);
|
| +
|
| + if (_socket != INVALID_SOCKET) {
|
| + return;
|
| } else {
|
| -
|
| - _socket = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
|
| - FROM_PROTOCOL_INFO,&pProtocolInfo, 0,
|
| - WSA_FLAG_OVERLAPPED);
|
| - free(lpProtocolBuf);
|
| -
|
| - if (_socket != INVALID_SOCKET)
|
| - {
|
| - return;
|
| - } else {
|
| - _qos = false;
|
| - WEBRTC_TRACE(
|
| - kTraceError,
|
| - kTraceTransport,
|
| - _id,
|
| - "UdpSocket2Windows::UdpSocket2Windows(), SOCKET_ERROR_NO_QOS");
|
| - }
|
| - }
|
| - // QoS not supported.
|
| - if(ipV6Enable)
|
| - {
|
| - _socket = WSASocket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP, 0 , 0,
|
| - WSA_FLAG_OVERLAPPED);
|
| - }else
|
| - {
|
| - _socket = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, 0 , 0,
|
| - WSA_FLAG_OVERLAPPED);
|
| - }
|
| - if (_socket == INVALID_SOCKET)
|
| - {
|
| - WEBRTC_TRACE(
|
| - kTraceError,
|
| - kTraceTransport,
|
| - _id,
|
| - "UdpSocket2Windows::UdpSocket2Windows(), INVALID_SOCKET,\
|
| + _qos = false;
|
| + WEBRTC_TRACE(
|
| + kTraceError, kTraceTransport, _id,
|
| + "UdpSocket2Windows::UdpSocket2Windows(), SOCKET_ERROR_NO_QOS");
|
| + }
|
| + }
|
| + // QoS not supported.
|
| + if (ipV6Enable) {
|
| + _socket =
|
| + WSASocket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP, 0, 0, WSA_FLAG_OVERLAPPED);
|
| + } else {
|
| + _socket =
|
| + WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, 0, 0, WSA_FLAG_OVERLAPPED);
|
| + }
|
| + if (_socket == INVALID_SOCKET) {
|
| + WEBRTC_TRACE(kTraceError, kTraceTransport, _id,
|
| + "UdpSocket2Windows::UdpSocket2Windows(), INVALID_SOCKET,\
|
| WSAerror: %d",
|
| - WSAGetLastError());
|
| - }
|
| -
|
| - // Disable send buffering on the socket to improve CPU usage.
|
| - // This is done by setting SO_SNDBUF to 0.
|
| - int32_t nZero = 0;
|
| - int32_t nRet = setsockopt(_socket, SOL_SOCKET, SO_SNDBUF,
|
| - (char*)&nZero, sizeof(nZero));
|
| - if( nRet == SOCKET_ERROR )
|
| - {
|
| - WEBRTC_TRACE(
|
| - kTraceError,
|
| - kTraceTransport,
|
| - _id,
|
| - "UdpSocket2Windows::UdpSocket2Windows(), SOCKET_ERROR,\
|
| + WSAGetLastError());
|
| + }
|
| +
|
| + // Disable send buffering on the socket to improve CPU usage.
|
| + // This is done by setting SO_SNDBUF to 0.
|
| + int32_t nZero = 0;
|
| + int32_t nRet =
|
| + setsockopt(_socket, SOL_SOCKET, SO_SNDBUF, (char*)&nZero, sizeof(nZero));
|
| + if (nRet == SOCKET_ERROR) {
|
| + WEBRTC_TRACE(kTraceError, kTraceTransport, _id,
|
| + "UdpSocket2Windows::UdpSocket2Windows(), SOCKET_ERROR,\
|
| WSAerror: %d",
|
| - WSAGetLastError());
|
| - }
|
| + WSAGetLastError());
|
| + }
|
| }
|
|
|
| UdpSocket2Windows::~UdpSocket2Windows()
|
| @@ -192,7 +169,7 @@ UdpSocket2Windows::~UdpSocket2Windows()
|
| if (_flow)
|
| {
|
| free(_flow);
|
| - _flow = NULL;
|
| + _flow = nullptr;
|
| }
|
|
|
| if (_gtc)
|
| @@ -422,75 +399,55 @@ int32_t UdpSocket2Windows::SendTo(const int8_t* buf, size_t len,
|
| void UdpSocket2Windows::IOCompleted(PerIoContext* pIOContext,
|
| uint32_t ioSize, uint32_t error)
|
| {
|
| - if(pIOContext == NULL || error == ERROR_OPERATION_ABORTED)
|
| - {
|
| - if ((pIOContext != NULL) &&
|
| - !pIOContext->ioInitiatedByPlatformThread &&
|
| - (error == ERROR_OPERATION_ABORTED) &&
|
| - (pIOContext->ioOperation == OP_READ) &&
|
| - _outstandingCallsDisabled)
|
| - {
|
| - // !pIOContext->initiatedIOByPlatformThread indicate that the I/O
|
| - // was not initiated by a PlatformThread thread.
|
| - // This may happen if the thread that initiated receiving (e.g.
|
| - // by calling StartListen())) is deleted before any packets have
|
| - // been received.
|
| - // In this case there is no packet in the PerIoContext. Re-use it
|
| - // to post a new PostRecv(..).
|
| - // Note 1: the PerIoContext will henceforth be posted by a thread
|
| - // that is controlled by the socket implementation.
|
| - // Note 2: This is more likely to happen to RTCP packets as
|
| - // they are less frequent than RTP packets.
|
| - // Note 3: _outstandingCallsDisabled being false indicates
|
| - // that the socket isn't being shut down.
|
| - // Note 4: This should only happen buffers set to receive packets
|
| - // (OP_READ).
|
| - } else {
|
| - if(pIOContext == NULL)
|
| - {
|
| - WEBRTC_TRACE(
|
| - kTraceError,
|
| - kTraceTransport,
|
| - _id,
|
| - "UdpSocket2Windows::IOCompleted(%d,%d,%d), %d",
|
| - (int32_t)pIOContext,
|
| - ioSize,
|
| - error,
|
| - pIOContext ? (int32_t)pIOContext->ioOperation : -1);
|
| - } else {
|
| - WEBRTC_TRACE(
|
| - kTraceDebug,
|
| - kTraceTransport,
|
| - _id,
|
| - "UdpSocket2Windows::IOCompleted() Operation aborted");
|
| - }
|
| - if(pIOContext)
|
| - {
|
| - int32_t remainingReceiveBuffers = --_receiveBuffers;
|
| - if(remainingReceiveBuffers < 0)
|
| - {
|
| - assert(false);
|
| - }
|
| - int32_t err = _mgr->PushIoContext(pIOContext);
|
| - if(err)
|
| - {
|
| - WEBRTC_TRACE(
|
| - kTraceError,
|
| - kTraceTransport,
|
| - _id,
|
| - "UdpSocket2Windows::IOCompleted(), err = %d, when\
|
| + if (pIOContext == nullptr || error == ERROR_OPERATION_ABORTED) {
|
| + if ((pIOContext != nullptr) && !pIOContext->ioInitiatedByPlatformThread &&
|
| + (error == ERROR_OPERATION_ABORTED) &&
|
| + (pIOContext->ioOperation == OP_READ) && _outstandingCallsDisabled) {
|
| + // !pIOContext->initiatedIOByPlatformThread indicate that the I/O
|
| + // was not initiated by a PlatformThread thread.
|
| + // This may happen if the thread that initiated receiving (e.g.
|
| + // by calling StartListen())) is deleted before any packets have
|
| + // been received.
|
| + // In this case there is no packet in the PerIoContext. Re-use it
|
| + // to post a new PostRecv(..).
|
| + // Note 1: the PerIoContext will henceforth be posted by a thread
|
| + // that is controlled by the socket implementation.
|
| + // Note 2: This is more likely to happen to RTCP packets as
|
| + // they are less frequent than RTP packets.
|
| + // Note 3: _outstandingCallsDisabled being false indicates
|
| + // that the socket isn't being shut down.
|
| + // Note 4: This should only happen buffers set to receive packets
|
| + // (OP_READ).
|
| + } else {
|
| + if (pIOContext == nullptr) {
|
| + WEBRTC_TRACE(kTraceError, kTraceTransport, _id,
|
| + "UdpSocket2Windows::IOCompleted(%d,%d,%d), %d",
|
| + (int32_t)pIOContext, ioSize, error,
|
| + pIOContext ? (int32_t)pIOContext->ioOperation : -1);
|
| + } else {
|
| + WEBRTC_TRACE(kTraceDebug, kTraceTransport, _id,
|
| + "UdpSocket2Windows::IOCompleted() Operation aborted");
|
| + }
|
| + if (pIOContext) {
|
| + int32_t remainingReceiveBuffers = --_receiveBuffers;
|
| + if (remainingReceiveBuffers < 0) {
|
| + assert(false);
|
| + }
|
| + int32_t err = _mgr->PushIoContext(pIOContext);
|
| + if (err) {
|
| + WEBRTC_TRACE(kTraceError, kTraceTransport, _id,
|
| + "UdpSocket2Windows::IOCompleted(), err = %d, when\
|
| pushing ioContext after error",
|
| - err);
|
| - }
|
| - }
|
| - OutstandingCallCompleted();
|
| - return;
|
| + err);
|
| }
|
| - } // if (pIOContext == NULL || error == ERROR_OPERATION_ABORTED)
|
| + }
|
| + OutstandingCallCompleted();
|
| + return;
|
| + }
|
| + } // if (pIOContext == nullptr || error == ERROR_OPERATION_ABORTED)
|
|
|
| - if(pIOContext->ioOperation == OP_WRITE)
|
| - {
|
| - _mgr->PushIoContext(pIOContext);
|
| + if (pIOContext->ioOperation == OP_WRITE) {
|
| + _mgr->PushIoContext(pIOContext);
|
| }
|
| else if(pIOContext->ioOperation == OP_READ)
|
| {
|
| @@ -734,7 +691,7 @@ bool UdpSocket2Windows::SetQos(int32_t serviceType,
|
|
|
| Qos.ProviderSpecific.len = 0;
|
|
|
| - Qos.ProviderSpecific.buf = NULL;
|
| + Qos.ProviderSpecific.buf = nullptr;
|
|
|
| ZeroMemory((int8_t *)&QosDestaddr, sizeof(QosDestaddr));
|
|
|
| @@ -784,8 +741,8 @@ bool UdpSocket2Windows::SetQos(int32_t serviceType,
|
| }
|
| // To set QoS with SIO_SET_QOS the socket must be locally bound first
|
| // or the call will fail with error code 10022.
|
| - int32_t result = WSAIoctl(GetFd(), SIO_SET_QOS, &Qos, sizeof(QOS),
|
| - NULL, 0, &BytesRet, NULL,NULL);
|
| + int32_t result = WSAIoctl(GetFd(), SIO_SET_QOS, &Qos, sizeof(QOS), nullptr,
|
| + 0, &BytesRet, nullptr, nullptr);
|
| ReleaseSocket();
|
| if (result == SOCKET_ERROR)
|
| {
|
| @@ -869,17 +826,17 @@ int32_t UdpSocket2Windows::SetTrafficControl(
|
| if(_filterHandle)
|
| {
|
| _gtc->TcDeleteFilter(_filterHandle);
|
| - _filterHandle = NULL;
|
| + _filterHandle = nullptr;
|
| }
|
| if(_flowHandle)
|
| {
|
| _gtc->TcDeleteFlow(_flowHandle);
|
| - _flowHandle = NULL;
|
| + _flowHandle = nullptr;
|
| }
|
| if(_clientHandle)
|
| {
|
| _gtc->TcDeregisterClient(_clientHandle);
|
| - _clientHandle = NULL;
|
| + _clientHandle = nullptr;
|
| }
|
| if ((0 == dscp) && (-2 == _pcp) && (-1 == pcp))
|
| {
|
| @@ -890,14 +847,14 @@ int32_t UdpSocket2Windows::SetTrafficControl(
|
| }
|
|
|
| TCI_CLIENT_FUNC_LIST QoSFunctions;
|
| - QoSFunctions.ClAddFlowCompleteHandler = NULL;
|
| - QoSFunctions.ClDeleteFlowCompleteHandler = NULL;
|
| - QoSFunctions.ClModifyFlowCompleteHandler = NULL;
|
| + QoSFunctions.ClAddFlowCompleteHandler = nullptr;
|
| + QoSFunctions.ClDeleteFlowCompleteHandler = nullptr;
|
| + QoSFunctions.ClModifyFlowCompleteHandler = nullptr;
|
| QoSFunctions.ClNotifyHandler = (TCI_NOTIFY_HANDLER)MyClNotifyHandler;
|
| // Register the client with Traffic control interface.
|
| HANDLE ClientHandle;
|
| - ULONG result = _gtc->TcRegisterClient(CURRENT_TCI_VERSION, NULL,
|
| - &QoSFunctions,&ClientHandle);
|
| + ULONG result = _gtc->TcRegisterClient(CURRENT_TCI_VERSION, nullptr,
|
| + &QoSFunctions, &ClientHandle);
|
| if(result != NO_ERROR)
|
| {
|
| // This is likely caused by the application not being run as
|
| @@ -910,7 +867,7 @@ int32_t UdpSocket2Windows::SetTrafficControl(
|
| // Find traffic control-enabled network interfaces that matches this
|
| // socket's IP address.
|
| ULONG BufferSize = 0;
|
| - result = _gtc->TcEnumerateInterfaces(ClientHandle, &BufferSize, NULL);
|
| + result = _gtc->TcEnumerateInterfaces(ClientHandle, &BufferSize, nullptr);
|
|
|
| if(result != NO_ERROR && result != ERROR_INSUFFICIENT_BUFFER)
|
| {
|
| @@ -931,12 +888,10 @@ int32_t UdpSocket2Windows::SetTrafficControl(
|
|
|
| PTC_IFC_DESCRIPTOR pInterfaceBuffer =
|
| (PTC_IFC_DESCRIPTOR)malloc(BufferSize);
|
| - if(pInterfaceBuffer == NULL)
|
| - {
|
| - WEBRTC_TRACE(kTraceError, kTraceTransport, _id,
|
| - "Out ot memory failure");
|
| - _gtc->TcDeregisterClient(ClientHandle);
|
| - return ERROR_NOT_ENOUGH_MEMORY;
|
| + if (pInterfaceBuffer == nullptr) {
|
| + WEBRTC_TRACE(kTraceError, kTraceTransport, _id, "Out ot memory failure");
|
| + _gtc->TcDeregisterClient(ClientHandle);
|
| + return ERROR_NOT_ENOUGH_MEMORY;
|
| }
|
|
|
| result = _gtc->TcEnumerateInterfaces(ClientHandle, &BufferSize,
|
| @@ -1009,7 +964,7 @@ int32_t UdpSocket2Windows::SetTrafficControl(
|
| return -1;
|
| }
|
| result = _gtc->TcOpenInterfaceW(oneinterface->pInterfaceName, ClientHandle,
|
| - NULL, &ifcHandle);
|
| + nullptr, &ifcHandle);
|
| if(result != NO_ERROR)
|
| {
|
| WEBRTC_TRACE(kTraceError, kTraceTransport, _id,
|
| @@ -1165,7 +1120,7 @@ int32_t UdpSocket2Windows::SetTrafficControl(
|
| trafficClass->TrafficClass = pcp;
|
| }
|
|
|
| - result = _gtc->TcAddFlow(ifcHandle, NULL, 0, _flow, &iflowHandle);
|
| + result = _gtc->TcAddFlow(ifcHandle, nullptr, 0, _flow, &iflowHandle);
|
| if(result != NO_ERROR)
|
| {
|
| _gtc->TcCloseInterface(ifcHandle);
|
|
|