/*
* $Id$
*
* Copyright (C) 2003-2015 JNode.org
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; If not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jnode.net.ipv4.dhcp;
import org.apache.log4j.Logger;
import org.jnode.net.ipv4.IPv4Address;
import org.jnode.net.ipv4.bootp.AbstractBOOTPClient;
import org.jnode.net.ipv4.bootp.BOOTPHeader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
/**
* System independent base class.
* Implementations should override doConfigure.
*
* @author markhale
*/
public class AbstractDHCPClient extends AbstractBOOTPClient {
private static final Logger log = Logger.getLogger(AbstractDHCPClient.class);
/**
* Create a DHCP discovery packet
*/
protected DatagramPacket createRequestPacket(BOOTPHeader hdr) throws IOException {
DHCPMessage msg = new DHCPMessage(hdr, DHCPMessage.DHCPDISCOVER);
return msg.toDatagramPacket();
}
protected boolean processResponse(int transactionID, DatagramPacket packet) throws IOException {
DHCPMessage msg = new DHCPMessage(packet);
BOOTPHeader hdr = msg.getHeader();
if (hdr.getOpcode() != BOOTPHeader.BOOTREPLY) {
// Not a response
return false;
}
if (hdr.getTransactionID() != transactionID) {
// Not for me
return false;
}
// debug the DHCP message
if (log.isDebugEnabled()) {
log.debug("Got Client IP address : " + hdr.getClientIPAddress());
log.debug("Got Your IP address : " + hdr.getYourIPAddress());
log.debug("Got Server IP address : " + hdr.getServerIPAddress());
log.debug("Got Gateway IP address : " + hdr.getGatewayIPAddress());
for (int n = 1; n < 255; n++) {
byte[] value = msg.getOption(n);
if (value != null) {
if (value.length == 1) {
log.debug("Option " + n + " : " + (int) (value[0]));
} else if (value.length == 2) {
log.debug("Option " + n + " : " + ((value[0] << 8) | value[1]));
} else if (value.length == 4) {
log.debug("Option " + n + " : " +
InetAddress.getByAddress(value).toString());
} else {
log.debug("Option " + n + " : " + new String(value));
}
}
}
}
switch (msg.getMessageType()) {
case DHCPMessage.DHCPOFFER:
byte[] serverID = msg.getOption(DHCPMessage.SERVER_IDENTIFIER_OPTION);
byte[] requestedIP = hdr.getYourIPAddress().getAddress();
hdr = new BOOTPHeader(
BOOTPHeader.BOOTREQUEST, transactionID, 0,
hdr.getClientIPAddress(), hdr.getClientHwAddress());
msg = new DHCPMessage(hdr, DHCPMessage.DHCPREQUEST);
msg.setOption(DHCPMessage.REQUESTED_IP_ADDRESS_OPTION, requestedIP);
msg.setOption(DHCPMessage.SERVER_IDENTIFIER_OPTION, serverID);
packet = msg.toDatagramPacket();
packet.setAddress(IPv4Address.BROADCAST_ADDRESS);
packet.setPort(SERVER_PORT);
socket.send(packet);
break;
case DHCPMessage.DHCPACK:
doConfigure(msg);
return true;
case DHCPMessage.DHCPNAK:
break;
}
return false;
}
protected void doConfigure(DHCPMessage msg) throws IOException {
doConfigure(msg.getHeader());
}
}