VirtualBox

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

Last change on this file since 53544 was 49735, checked in by vboxsync, 11 years ago

VBoxNetBaseService hides all details of internal network implementation and become responsible for supporting receiving loop. Notification of children are done via introduced interface:

virtual int processFrame(void *, size_t) = 0;
virtual int processGSO(PCPDMNETWORKGSO, size_t) = 0;
virtual int processUDP(void *, size_t) = 0;

processFrame() and processGSO() might return VERR_IGNORED, to inform base service switch to processUDP() (e.g. for DHCP needs)

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