summaryrefslogtreecommitdiffstats
path: root/dom/system/gonk/NetIdManager.cpp
blob: 510ec8b224e225b94e6fcc7f5ef79d019c75c3ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "NetIdManager.h"

NetIdManager::NetIdManager()
  : mNextNetId(MIN_NET_ID)
{
}

int NetIdManager::getNextNetId()
{
  // Modified from
  // http://androidxref.com/5.0.0_r2/xref/frameworks/base/services/
  //        core/java/com/android/server/ConnectivityService.java#764

  int netId = mNextNetId;
  if (++mNextNetId > MAX_NET_ID) {
    mNextNetId = MIN_NET_ID;
  }

  return netId;
}

void NetIdManager::acquire(const nsString& aInterfaceName,
                           NetIdInfo* aNetIdInfo)
{
  // Lookup or create one.
  if (!mInterfaceToNetIdHash.Get(aInterfaceName, aNetIdInfo)) {
    aNetIdInfo->mNetId = getNextNetId();
    aNetIdInfo->mRefCnt = 1;
  } else {
    aNetIdInfo->mRefCnt++;
  }

  // Update hash and return.
  mInterfaceToNetIdHash.Put(aInterfaceName, *aNetIdInfo);

  return;
}

bool NetIdManager::lookup(const nsString& aInterfaceName,
                          NetIdInfo* aNetIdInfo)
{
  return mInterfaceToNetIdHash.Get(aInterfaceName, aNetIdInfo);
}

bool NetIdManager::release(const nsString& aInterfaceName,
                           NetIdInfo* aNetIdInfo)
{
  if (!mInterfaceToNetIdHash.Get(aInterfaceName, aNetIdInfo)) {
    return false; // No such key.
  }

  aNetIdInfo->mRefCnt--;

  // Update the hash if still be referenced.
  if (aNetIdInfo->mRefCnt > 0) {
    mInterfaceToNetIdHash.Put(aInterfaceName, *aNetIdInfo);
    return true;
  }

  // No longer be referenced. Remove the entry.
  mInterfaceToNetIdHash.Remove(aInterfaceName);

  return true;
}