VirtualBox

source: vbox/trunk/src/VBox/NetworkServices/DHCP/NetworkManagerDhcp.cpp@ 75251

Last change on this file since 75251 was 69500, checked in by vboxsync, 7 years ago

*: scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.0 KB
Line 
1/* $Id: NetworkManagerDhcp.cpp 69500 2017-10-28 15:14:05Z vboxsync $ */
2/** @file
3 * NetworkManagerDhcp - Network Manager part handling Dhcp.
4 */
5
6/*
7 * Copyright (C) 2013-2017 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#include <iprt/asm.h>
23#include <iprt/cdefs.h>
24#include <iprt/getopt.h>
25#include <iprt/net.h>
26#include <iprt/param.h>
27#include <iprt/path.h>
28#include <iprt/stream.h>
29#include <iprt/time.h>
30#include <iprt/string.h>
31
32#include "../NetLib/shared_ptr.h"
33
34#include <vector>
35#include <list>
36#include <string>
37#include <map>
38
39#include <VBox/sup.h>
40#include <VBox/intnet.h>
41
42#define BASE_SERVICES_ONLY
43#include "../NetLib/VBoxNetBaseService.h"
44#include "Config.h"
45#include "ClientDataInt.h"
46
47/**
48 * The client is requesting an offer.
49 *
50 * @returns true.
51 *
52 * @param pDhcpMsg The message.
53 * @param cb The message size.
54 */
55bool NetworkManager::handleDhcpReqDiscover(PCRTNETBOOTP pDhcpMsg, size_t cb)
56{
57 RawOption opt;
58 RT_ZERO(opt);
59
60 /* 1. Find client */
61 ConfigurationManager *confManager = ConfigurationManager::getConfigurationManager();
62 Client client = confManager->getClientByDhcpPacket(pDhcpMsg, cb);
63
64 /* 2. Find/Bind lease for client */
65 Lease lease = confManager->allocateLease4Client(client, pDhcpMsg, cb);
66 AssertReturn(lease != Lease::NullLease, VINF_SUCCESS);
67
68 int rc = ConfigurationManager::extractRequestList(pDhcpMsg, cb, opt);
69 NOREF(rc); /** @todo check */
70
71 /* 3. Send of offer */
72
73 lease.bindingPhase(true);
74 lease.phaseStart(RTTimeMilliTS());
75 lease.setExpiration(300); /* 3 min. */
76 offer4Client(client, pDhcpMsg->bp_xid, opt.au8RawOpt, opt.cbRawOpt);
77
78 return true;
79}
80
81
82/**
83 * The client is requesting an offer.
84 *
85 * @returns true.
86 *
87 * @param pDhcpMsg The message.
88 * @param cb The message size.
89 */
90bool NetworkManager::handleDhcpReqRequest(PCRTNETBOOTP pDhcpMsg, size_t cb)
91{
92 ConfigurationManager *confManager = ConfigurationManager::getConfigurationManager();
93
94 /* 1. find client */
95 Client client = confManager->getClientByDhcpPacket(pDhcpMsg, cb);
96
97 /* 2. find bound lease */
98 Lease l = client.lease();
99 if (l != Lease::NullLease)
100 {
101
102 if (l.isExpired())
103 {
104 /* send client to INIT state */
105 Client c(client);
106 nak(client, pDhcpMsg->bp_xid);
107 confManager->expireLease4Client(c);
108 return true;
109 }
110 /* XXX: Validate request */
111 RawOption opt;
112 RT_ZERO(opt);
113
114 Client c(client);
115 int rc = confManager->commitLease4Client(c);
116 AssertRCReturn(rc, false);
117
118 rc = ConfigurationManager::extractRequestList(pDhcpMsg, cb, opt);
119 AssertRCReturn(rc, false);
120
121 ack(client, pDhcpMsg->bp_xid, opt.au8RawOpt, opt.cbRawOpt);
122 }
123 else
124 {
125 nak(client, pDhcpMsg->bp_xid);
126 }
127 return true;
128}
129
130
131/**
132 * The client is declining an offer we've made.
133 *
134 * @returns true.
135 *
136 * @param pDhcpMsg The message.
137 * @param cb The message size.
138 */
139bool NetworkManager::handleDhcpReqDecline(PCRTNETBOOTP, size_t)
140{
141 /** @todo Probably need to match the server IP here to work correctly with
142 * other servers. */
143
144 /*
145 * The client is supposed to pass us option 50, requested address,
146 * from the offer. We also match the lease state. Apparently the
147 * MAC address is not supposed to be checked here.
148 */
149
150 /** @todo this is not required in the initial implementation, do it later. */
151 return true;
152}
153
154
155/**
156 * The client is releasing its lease - good boy.
157 *
158 * @returns true.
159 *
160 * @param pDhcpMsg The message.
161 * @param cb The message size.
162 */
163bool NetworkManager::handleDhcpReqRelease(PCRTNETBOOTP, size_t)
164{
165 /** @todo Probably need to match the server IP here to work correctly with
166 * other servers. */
167
168 /*
169 * The client may pass us option 61, client identifier, which we should
170 * use to find the lease by.
171 *
172 * We're matching MAC address and lease state as well.
173 */
174
175 /*
176 * If no client identifier or if we couldn't find a lease by using it,
177 * we will try look it up by the client IP address.
178 */
179
180
181 /*
182 * If found, release it.
183 */
184
185
186 /** @todo this is not required in the initial implementation, do it later. */
187 return true;
188}
189
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