VirtualBox

source: vbox/trunk/src/VBox/VMM/VMMAll/PDMAllNetShaper.cpp@ 65504

Last change on this file since 65504 was 62478, checked in by vboxsync, 8 years ago

(C) 2016

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 2.9 KB
Line 
1/* $Id: PDMAllNetShaper.cpp 62478 2016-07-22 18:29:06Z vboxsync $ */
2/** @file
3 * PDM Network Shaper - Limit network traffic according to bandwidth group settings.
4 */
5
6/*
7 * Copyright (C) 2011-2016 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18
19/*********************************************************************************************************************************
20* Header Files *
21*********************************************************************************************************************************/
22#define LOG_GROUP LOG_GROUP_NET_SHAPER
23#include <VBox/vmm/pdm.h>
24#include <VBox/log.h>
25#include <iprt/time.h>
26
27#include <VBox/vmm/pdmnetshaper.h>
28#include "PDMNetShaperInternal.h"
29
30
31/**
32 * Obtain bandwidth in a bandwidth group.
33 *
34 * @returns True if bandwidth was allocated, false if not.
35 * @param pFilter Pointer to the filter that allocates bandwidth.
36 * @param cbTransfer Number of bytes to allocate.
37 */
38VMMDECL(bool) PDMNsAllocateBandwidth(PPDMNSFILTER pFilter, size_t cbTransfer)
39{
40 AssertPtrReturn(pFilter, true);
41 if (!VALID_PTR(pFilter->CTX_SUFF(pBwGroup)))
42 return true;
43
44 PPDMNSBWGROUP pBwGroup = ASMAtomicReadPtrT(&pFilter->CTX_SUFF(pBwGroup), PPDMNSBWGROUP);
45 int rc = PDMCritSectEnter(&pBwGroup->Lock, VERR_SEM_BUSY); AssertRC(rc);
46 if (RT_UNLIKELY(rc == VERR_SEM_BUSY))
47 return true;
48
49 bool fAllowed = true;
50 if (pBwGroup->cbPerSecMax)
51 {
52 /* Re-fill the bucket first */
53 uint64_t tsNow = RTTimeSystemNanoTS();
54 uint32_t uTokensAdded = (tsNow - pBwGroup->tsUpdatedLast) * pBwGroup->cbPerSecMax / (1000 * 1000 * 1000);
55 uint32_t uTokens = RT_MIN(pBwGroup->cbBucket, uTokensAdded + pBwGroup->cbTokensLast);
56
57 if (cbTransfer > uTokens)
58 {
59 fAllowed = false;
60 ASMAtomicWriteBool(&pFilter->fChoked, true);
61 }
62 else
63 {
64 pBwGroup->tsUpdatedLast = tsNow;
65 pBwGroup->cbTokensLast = uTokens - (uint32_t)cbTransfer;
66 }
67 Log2(("pdmNsAllocateBandwidth: BwGroup=%#p{%s} cbTransfer=%u uTokens=%u uTokensAdded=%u fAllowed=%RTbool\n",
68 pBwGroup, R3STRING(pBwGroup->pszNameR3), cbTransfer, uTokens, uTokensAdded, fAllowed));
69 }
70 else
71 Log2(("pdmNsAllocateBandwidth: BwGroup=%#p{%s} disabled fAllowed=%RTbool\n",
72 pBwGroup, R3STRING(pBwGroup->pszNameR3), fAllowed));
73
74 rc = PDMCritSectLeave(&pBwGroup->Lock); AssertRC(rc);
75 return fAllowed;
76}
77
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette