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_TEST_CHANNEL_TRANSPORT_TRAFFIC_CONTROL_WINDOWS_H_
12#define WEBRTC_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/interface/trace.h"
27
28namespace webrtc {
29namespace test {
30void MyClNotifyHandler(HANDLE ClRegCtx, HANDLE ClIfcCtx, ULONG Event,
31                       HANDLE SubCode, ULONG BufSize, PVOID Buffer);
32
33
34typedef ULONG (WINAPI *registerFn)(ULONG, HANDLE, PTCI_CLIENT_FUNC_LIST,
35                                   PHANDLE);
36typedef ULONG (WINAPI *deregisterFn)(HANDLE);
37typedef ULONG (WINAPI *enumerateFn)(HANDLE, PULONG, PTC_IFC_DESCRIPTOR);
38typedef ULONG (WINAPI *openInterfaceFn)(LPWSTR, HANDLE, HANDLE, PHANDLE);
39typedef ULONG (WINAPI *closeInterfaceFn)(HANDLE);
40typedef ULONG (WINAPI *flowAddFn)(HANDLE, HANDLE, ULONG, PTC_GEN_FLOW, PHANDLE);
41typedef ULONG (WINAPI *filterAddFn)(HANDLE, PTC_GEN_FILTER, PHANDLE);
42typedef ULONG (WINAPI *flowDeleteFn)(HANDLE);
43typedef ULONG (WINAPI *filterDeleteFn)(HANDLE);
44
45class 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    int32_t ChangeUniqueId(const int32_t id);
53
54    ULONG TcRegisterClient(ULONG TciVersion, HANDLE ClRegCtx,
55                           PTCI_CLIENT_FUNC_LIST ClientHandlerList,
56                           PHANDLE pClientHandle);
57
58    ULONG TcDeregisterClient(HANDLE clientHandle);
59
60    ULONG TcEnumerateInterfaces(HANDLE ClientHandle, PULONG pBufferSize,
61                                PTC_IFC_DESCRIPTOR interfaceBuffer);
62
63    ULONG TcOpenInterfaceW(LPWSTR pInterfaceName, HANDLE ClientHandle,
64                           HANDLE ClIfcCtx, PHANDLE pIfcHandle);
65
66    ULONG TcCloseInterface(HANDLE IfcHandle);
67
68    ULONG TcAddFlow(HANDLE IfcHandle, HANDLE ClFlowCtx, ULONG Flags,
69                    PTC_GEN_FLOW pGenericFlow, PHANDLE pFlowHandle);
70
71    ULONG TcAddFilter(HANDLE FlowHandle, PTC_GEN_FILTER pGenericFilter,
72                      PHANDLE pFilterHandle);
73
74    ULONG TcDeleteFlow(HANDLE FlowHandle);
75    ULONG TcDeleteFilter(HANDLE FilterHandle);
76private:
77    TrafficControlWindows(const int32_t id);
78    int32_t _id;
79    TCI_CLIENT_FUNC_LIST QoSFunctions;
80
81    static TrafficControlWindows* instance;
82
83    registerFn tcRegister;
84    deregisterFn tcDeregister;
85
86    enumerateFn tcEnumerate;
87    openInterfaceFn tcOpenInterface;
88    closeInterfaceFn tcCloseInterface;
89
90    flowAddFn tcAddFlow;
91    flowDeleteFn tcDeleteFlow;
92
93    filterAddFn tcAddFilter;
94    filterDeleteFn tcDeleteFilter;
95
96    static uint32_t refCounter;
97};
98
99}  // namespace test
100}  // namespace webrtc
101
102#endif  // WEBRTC_TEST_CHANNEL_TRANSPORT_TRAFFIC_CONTROL_WINDOWS_H_
103