Home | History | Annotate | Download | only in channel_transport
      1 /*
      2  *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include "webrtc/test/channel_transport/traffic_control_win.h"
     12 
     13 #include <assert.h>
     14 
     15 #include "webrtc/system_wrappers/interface/trace.h"
     16 
     17 namespace webrtc {
     18 namespace test {
     19 
     20 TrafficControlWindows* TrafficControlWindows::instance = NULL;
     21 uint32_t TrafficControlWindows::refCounter = 0;
     22 
     23 TrafficControlWindows::TrafficControlWindows(const int32_t id) : _id(id)
     24 {
     25 }
     26 
     27 TrafficControlWindows* TrafficControlWindows::GetInstance(
     28     const int32_t id)
     29 {
     30     if(instance != NULL)
     31     {
     32         WEBRTC_TRACE(
     33             kTraceDebug,
     34             kTraceTransport,
     35             id,
     36             "TrafficControlWindows - Returning already created object");
     37         refCounter++;
     38         return instance;
     39     }
     40 
     41     WEBRTC_TRACE(kTraceMemory, kTraceTransport, id,
     42                  "TrafficControlWindows - Creating new object");
     43     instance = new TrafficControlWindows(id);
     44     if(instance == NULL)
     45     {
     46         WEBRTC_TRACE(kTraceMemory, kTraceTransport, id,
     47                      "TrafficControlWindows - Error allocating memory");
     48         return NULL;
     49     }
     50 
     51     instance->tcRegister = NULL;
     52     instance->tcDeregister = NULL;
     53 
     54     instance->tcEnumerate = NULL;
     55     instance->tcOpenInterface = NULL;
     56     instance->tcCloseInterface = NULL;
     57 
     58     instance->tcAddFlow = NULL;
     59     instance->tcDeleteFlow = NULL;
     60 
     61     instance->tcAddFilter = NULL;
     62     instance->tcDeleteFilter = NULL;
     63 
     64     HMODULE trafficLib = LoadLibrary(TEXT("traffic.dll"));
     65     if(trafficLib == NULL)
     66     {
     67         WEBRTC_TRACE(
     68             kTraceWarning,
     69             kTraceTransport,
     70             id,
     71             "TrafficControlWindows - No QOS support, LoadLibrary returned NULL,\
     72  last error: %d\n",
     73             GetLastError());
     74         delete instance;
     75         instance = NULL;
     76         return NULL;
     77     }
     78 
     79     instance->tcRegister = (registerFn)GetProcAddress(trafficLib,
     80                                                       "TcRegisterClient");
     81     instance->tcDeregister = (deregisterFn)GetProcAddress(trafficLib,
     82                                                           "TcDeregisterClient");
     83     instance->tcEnumerate = (enumerateFn)GetProcAddress(
     84         trafficLib,
     85         "TcEnumerateInterfaces");
     86     instance->tcOpenInterface = (openInterfaceFn)GetProcAddress(
     87         trafficLib,
     88         "TcOpenInterfaceW");
     89     instance->tcCloseInterface = (closeInterfaceFn)GetProcAddress(
     90         trafficLib,
     91         "TcCloseInterface");
     92     instance->tcAddFlow = (flowAddFn)GetProcAddress(trafficLib,
     93                                                     "TcAddFlow");
     94     instance->tcDeleteFlow = (flowDeleteFn)GetProcAddress(trafficLib,
     95                                                           "TcDeleteFlow");
     96 
     97     instance->tcAddFilter = (filterAddFn)GetProcAddress(trafficLib,
     98                                                         "TcAddFilter");
     99     instance->tcDeleteFilter = (filterDeleteFn)GetProcAddress(trafficLib,
    100                                                               "TcDeleteFilter");
    101 
    102     if(instance->tcRegister       == NULL ||
    103        instance->tcDeregister     == NULL ||
    104        instance->tcEnumerate      == NULL ||
    105        instance->tcOpenInterface  == NULL ||
    106        instance->tcCloseInterface == NULL ||
    107        instance->tcAddFlow        == NULL ||
    108        instance->tcAddFilter      == NULL ||
    109        instance->tcDeleteFlow     == NULL ||
    110        instance->tcDeleteFilter   == NULL)
    111     {
    112         delete instance;
    113         instance = NULL;
    114         WEBRTC_TRACE(
    115             kTraceError,
    116             kTraceTransport,
    117             id,
    118             "TrafficControlWindows - Could not find function pointer for\
    119  traffic control functions");
    120         WEBRTC_TRACE(
    121             kTraceError,
    122             kTraceTransport,
    123             id,
    124             "Tcregister    : %x, tcDeregister: %x, tcEnumerate: %x,\
    125  tcOpenInterface: %x, tcCloseInterface: %x, tcAddFlow: %x, tcAddFilter: %x,\
    126  tcDeleteFlow: %x, tcDeleteFilter: %x",
    127             instance->tcRegister,
    128             instance->tcDeregister,
    129             instance->tcEnumerate,
    130             instance->tcOpenInterface,
    131             instance->tcCloseInterface,
    132             instance->tcAddFlow,
    133             instance->tcAddFilter,
    134             instance->tcDeleteFlow,
    135             instance->tcDeleteFilter );
    136         return NULL;
    137     }
    138     refCounter++;
    139     return instance;
    140 }
    141 
    142 void TrafficControlWindows::Release(TrafficControlWindows* gtc)
    143 {
    144     if (0 == refCounter)
    145     {
    146         WEBRTC_TRACE(kTraceError, kTraceTransport, -1,
    147                      "TrafficControlWindows - Cannot release, refCounter is 0");
    148         return;
    149     }
    150     if (NULL == gtc)
    151     {
    152         WEBRTC_TRACE(kTraceDebug, kTraceTransport, -1,
    153                      "TrafficControlWindows - Not releasing, gtc is NULL");
    154         return;
    155     }
    156 
    157     WEBRTC_TRACE(kTraceDebug, kTraceTransport, gtc->_id,
    158                  "TrafficControlWindows - Releasing object");
    159     refCounter--;
    160     if ((0 == refCounter) && instance)
    161     {
    162         WEBRTC_TRACE(kTraceMemory, kTraceTransport, gtc->_id,
    163                      "TrafficControlWindows - Deleting object");
    164         delete instance;
    165         instance = NULL;
    166     }
    167 }
    168 int32_t TrafficControlWindows::ChangeUniqueId(const int32_t id)
    169 {
    170     _id = id;
    171     return 0;
    172 }
    173 
    174 ULONG TrafficControlWindows::TcRegisterClient(
    175     ULONG TciVersion,
    176     HANDLE ClRegCtx,
    177     PTCI_CLIENT_FUNC_LIST ClientHandlerList,
    178     PHANDLE pClientHandle)
    179 {
    180     assert(tcRegister != NULL);
    181 
    182     return tcRegister(TciVersion, ClRegCtx, ClientHandlerList, pClientHandle);
    183 }
    184 
    185 ULONG TrafficControlWindows::TcDeregisterClient(HANDLE clientHandle)
    186 {
    187     assert(tcDeregister != NULL);
    188 
    189     return tcDeregister(clientHandle);
    190 }
    191 
    192 
    193 ULONG TrafficControlWindows::TcEnumerateInterfaces(
    194     HANDLE ClientHandle,
    195     PULONG pBufferSize,
    196     PTC_IFC_DESCRIPTOR interfaceBuffer)
    197 {
    198     assert(tcEnumerate != NULL);
    199 
    200     return tcEnumerate(ClientHandle, pBufferSize, interfaceBuffer);
    201 }
    202 
    203 
    204 ULONG TrafficControlWindows::TcOpenInterfaceW(LPWSTR pInterfaceName,
    205                                               HANDLE ClientHandle,
    206                                               HANDLE ClIfcCtx,
    207                                               PHANDLE pIfcHandle)
    208 {
    209     assert(tcOpenInterface != NULL);
    210 
    211     return tcOpenInterface(pInterfaceName, ClientHandle, ClIfcCtx, pIfcHandle);
    212 
    213 }
    214 
    215 ULONG TrafficControlWindows::TcCloseInterface(HANDLE IfcHandle)
    216 {
    217     assert(tcCloseInterface != NULL);
    218 
    219     return tcCloseInterface(IfcHandle);
    220 }
    221 
    222 ULONG TrafficControlWindows::TcAddFlow(HANDLE IfcHandle, HANDLE ClFlowCtx,
    223                                        ULONG  Flags, PTC_GEN_FLOW pGenericFlow,
    224                                        PHANDLE pFlowHandle)
    225 {
    226     assert(tcAddFlow != NULL);
    227     return tcAddFlow(IfcHandle, ClFlowCtx, Flags, pGenericFlow, pFlowHandle);
    228 }
    229 
    230 ULONG TrafficControlWindows::TcAddFilter(HANDLE FlowHandle,
    231                                          PTC_GEN_FILTER pGenericFilter,
    232                                          PHANDLE pFilterHandle)
    233 {
    234     assert(tcAddFilter != NULL);
    235     return tcAddFilter(FlowHandle, pGenericFilter, pFilterHandle);
    236 }
    237 
    238 ULONG TrafficControlWindows::TcDeleteFlow(HANDLE FlowHandle)
    239 {
    240     assert(tcDeleteFlow != NULL);
    241     return tcDeleteFlow(FlowHandle);
    242 
    243 }
    244 
    245 ULONG TrafficControlWindows::TcDeleteFilter(HANDLE FilterHandle)
    246 {
    247     assert(tcDeleteFilter != NULL);
    248     return tcDeleteFilter(FilterHandle);
    249 }
    250 
    251 void MyClNotifyHandler(HANDLE ClRegCtx, HANDLE ClIfcCtx, ULONG Event,
    252                        HANDLE SubCode, ULONG BufSize, PVOID Buffer)
    253 {
    254 }
    255 
    256 }  // namespace test
    257 }  // namespace webrtc
    258