⛏️ index : haiku.git

/*
 * Copyright 2006-2010, Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Axel DΓΆrfler, axeld@pinc-software.de
 */
#ifndef DHCP_CLIENT_H
#define DHCP_CLIENT_H


#include "AutoconfigClient.h"

#include <netinet/in.h>

#include <NetworkAddress.h>


class BMessageRunner;
struct dhcp_message;
struct socket_timeout;


enum dhcp_state {
	INIT,
	SELECTING,
	INIT_REBOOT,
	REBOOTING,
	REQUESTING,
	BOUND,
	RENEWING,
	REBINDING,
};


class DHCPClient : public AutoconfigClient {
public:
								DHCPClient(BMessenger target,
									const char* device);
	virtual						~DHCPClient();

	virtual	status_t			Start();

	virtual	void				MessageReceived(BMessage* message);

private:
	static	status_t			_NegotiatorThread(void* data);
			status_t			_Negotiate();
			status_t			_GotMessage(dhcp_state& state,
									dhcp_message* message);
			status_t			_StateTransition(int socket, dhcp_state& state);
			void				_ParseOptions(dhcp_message& message,
									BMessage& address,
									BMessage& resolverConfiguration);
			void				_PrepareMessage(dhcp_message& message,
									dhcp_state state);
			status_t			_SendMessage(int socket, dhcp_message& message,
									const BNetworkAddress& address) const;
			dhcp_state			_CurrentState() const;
			bool				_TimeoutShift(int socket, dhcp_state& state,
									socket_timeout& timeout);
			void				_RestartLease(bigtime_t lease);

	static	BString				_AddressToString(const uint8* data);
	static 	BString				_AddressToString(in_addr_t address);

private:
			BMessage			fConfiguration;
			BMessage			fResolverConfiguration;
			BMessageRunner*		fRunner;
			thread_id			fNegotiateThread;
			uint8				fMAC[6];
			BString				fHostName;
			uint32				fTransactionID;
			in_addr_t			fAssignedAddress;
			BNetworkAddress		fServer;
			bigtime_t			fStartTime;
			bigtime_t			fRequestTime;
			bigtime_t			fRenewalTime;
			bigtime_t			fRebindingTime;
			bigtime_t			fLeaseTime;
			status_t			fStatus;
};

#endif	// DHCP_CLIENT_H