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 #ifndef WEBRTC_VOICE_ENGINE_TEST_CHANNEL_TRANSPORT_TRAFFIC_CONTROL_WINDOWS_H_
12 #define WEBRTC_VOICE_ENGINE_TEST_CHANNEL_TRANSPORT_TRAFFIC_CONTROL_WINDOWS_H_
13 
14 #ifndef WIN32_LEAN_AND_MEAN
15 #define WIN32_LEAN_AND_MEAN
16 #endif
17 
18 // Disable deprication warning from traffic.h
19 #pragma warning(disable : 4995)
20 
21 #include <windows.h>
22 #include <qos.h>
23 #include <ntddndis.h>
24 #include <traffic.h>
25 
26 #include "webrtc/system_wrappers/include/trace.h"
27 
28 namespace webrtc {
29 namespace test {
30 void MyClNotifyHandler(HANDLE ClRegCtx, HANDLE ClIfcCtx, ULONG Event,
31                        HANDLE SubCode, ULONG BufSize, PVOID Buffer);
32 
33 
34 typedef ULONG (WINAPI *registerFn)(ULONG, HANDLE, PTCI_CLIENT_FUNC_LIST,
35                                    PHANDLE);
36 typedef ULONG (WINAPI *deregisterFn)(HANDLE);
37 typedef ULONG (WINAPI *enumerateFn)(HANDLE, PULONG, PTC_IFC_DESCRIPTOR);
38 typedef ULONG (WINAPI *openInterfaceFn)(LPWSTR, HANDLE, HANDLE, PHANDLE);
39 typedef ULONG (WINAPI *closeInterfaceFn)(HANDLE);
40 typedef ULONG (WINAPI *flowAddFn)(HANDLE, HANDLE, ULONG, PTC_GEN_FLOW, PHANDLE);
41 typedef ULONG (WINAPI *filterAddFn)(HANDLE, PTC_GEN_FILTER, PHANDLE);
42 typedef ULONG (WINAPI *flowDeleteFn)(HANDLE);
43 typedef ULONG (WINAPI *filterDeleteFn)(HANDLE);
44 
45 class TrafficControlWindows
46 {
47  public:
48     // Factory method. Constructor disabled.
49     static TrafficControlWindows* GetInstance(const int32_t id);
50     static void Release(TrafficControlWindows* gtc);
51 
52     ULONG TcRegisterClient(ULONG TciVersion, HANDLE ClRegCtx,
53                            PTCI_CLIENT_FUNC_LIST ClientHandlerList,
54                            PHANDLE pClientHandle);
55 
56     ULONG TcDeregisterClient(HANDLE clientHandle);
57 
58     ULONG TcEnumerateInterfaces(HANDLE ClientHandle, PULONG pBufferSize,
59                                 PTC_IFC_DESCRIPTOR interfaceBuffer);
60 
61     ULONG TcOpenInterfaceW(LPWSTR pInterfaceName, HANDLE ClientHandle,
62                            HANDLE ClIfcCtx, PHANDLE pIfcHandle);
63 
64     ULONG TcCloseInterface(HANDLE IfcHandle);
65 
66     ULONG TcAddFlow(HANDLE IfcHandle, HANDLE ClFlowCtx, ULONG Flags,
67                     PTC_GEN_FLOW pGenericFlow, PHANDLE pFlowHandle);
68 
69     ULONG TcAddFilter(HANDLE FlowHandle, PTC_GEN_FILTER pGenericFilter,
70                       PHANDLE pFilterHandle);
71 
72     ULONG TcDeleteFlow(HANDLE FlowHandle);
73     ULONG TcDeleteFilter(HANDLE FilterHandle);
74 private:
75     TrafficControlWindows(const int32_t id);
76     TCI_CLIENT_FUNC_LIST QoSFunctions;
77 
78     static TrafficControlWindows* instance;
79 
80     registerFn tcRegister;
81     deregisterFn tcDeregister;
82 
83     enumerateFn tcEnumerate;
84     openInterfaceFn tcOpenInterface;
85     closeInterfaceFn tcCloseInterface;
86 
87     flowAddFn tcAddFlow;
88     flowDeleteFn tcDeleteFlow;
89 
90     filterAddFn tcAddFilter;
91     filterDeleteFn tcDeleteFilter;
92 
93     static uint32_t refCounter;
94 };
95 
96 }  // namespace test
97 }  // namespace webrtc
98 
99 #endif  // WEBRTC_VOICE_ENGINE_TEST_CHANNEL_TRANSPORT_TRAFFIC_CONTROL_WINDOWS_H_
100