VirtualBox

source: vbox/trunk/src/VBox/NetworkServices/Dhcpd/IPv4Pool.cpp@ 76690

Last change on this file since 76690 was 76553, checked in by vboxsync, 6 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.0 KB
Line 
1/* $Id: IPv4Pool.cpp 76553 2019-01-01 01:45:53Z vboxsync $ */
2/** @file
3 * DHCP server - a pool of IPv4 addresses
4 */
5
6/*
7 * Copyright (C) 2017-2019 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#include <iprt/errcore.h>
19#include <iprt/stream.h>
20
21#include "IPv4Pool.h"
22
23
24int IPv4Pool::init(const IPv4Range &aRange)
25{
26 if (!aRange.isValid())
27 return VERR_INVALID_PARAMETER;
28
29 m_range = aRange;
30 m_pool.insert(m_range);
31 return VINF_SUCCESS;
32}
33
34
35int IPv4Pool::init(RTNETADDRIPV4 aFirstAddr, RTNETADDRIPV4 aLastAddr)
36{
37 IPv4Range range(aFirstAddr, aLastAddr);
38
39 if (!range.isValid())
40 return VERR_INVALID_PARAMETER;
41
42 m_range = range;
43 m_pool.insert(m_range);
44 return VINF_SUCCESS;
45}
46
47
48int IPv4Pool::insert(const IPv4Range &range)
49{
50 if (!m_range.isValid())
51 return VERR_INVALID_PARAMETER;
52
53 if (!m_range.contains(range))
54 return VERR_INVALID_PARAMETER;
55
56 it_t it = m_pool.upper_bound(IPv4Range(range.LastAddr)); /* successor */
57 if (it != m_pool.begin())
58 {
59 it_t prev(it);
60 --prev;
61 if (range.FirstAddr <= prev->LastAddr) {
62#if 1 /* XXX */
63 RTPrintf("%08x-%08x conflicts with %08x-%08x\n",
64 range.FirstAddr, range.LastAddr,
65 prev->FirstAddr, prev->LastAddr);
66#endif
67 return VERR_INVALID_PARAMETER;
68 }
69 }
70
71 m_pool.insert(it, range);
72 return VINF_SUCCESS;
73}
74
75
76RTNETADDRIPV4 IPv4Pool::allocate()
77{
78 if (m_pool.empty())
79 {
80 RTNETADDRIPV4 res = { 0 };
81 return res;
82 }
83
84 it_t beg = m_pool.begin();
85 ip_haddr_t addr = beg->FirstAddr;
86
87 if (beg->FirstAddr == beg->LastAddr)
88 {
89 m_pool.erase(beg);
90 }
91 else
92 {
93 IPv4Range trimmed = *beg;
94 ++trimmed.FirstAddr;
95 m_pool.erase(beg);
96 m_pool.insert(trimmed);
97 }
98
99 RTNETADDRIPV4 res = { RT_H2N_U32(addr) };
100 return res;
101}
102
103
104bool IPv4Pool::allocate(RTNETADDRIPV4 addr)
105{
106 it_t it = m_pool.lower_bound(IPv4Range(addr)); /* candidate range */
107 if (it == m_pool.end())
108 return false;
109
110 Assert(RT_N2H_U32(addr.u) <= it->LastAddr); /* by definition of < and lower_bound */
111
112 if (!it->contains(addr))
113 return false;
114
115 const ip_haddr_t haddr = RT_N2H_U32(addr.u);
116 ip_haddr_t first = it->FirstAddr;
117 ip_haddr_t last = it->LastAddr;
118
119 m_pool.erase(it);
120 if (first != last)
121 {
122 if (haddr == first)
123 {
124 insert(++first, last);
125 }
126 else if (haddr == last)
127 {
128 insert(first, --last);
129 }
130 else
131 {
132 insert(first, haddr - 1);
133 insert(haddr + 1, last);
134 }
135 }
136
137 return true;
138}
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