/******************************************************************************
 * Copyright (c) 2004, 2008 IBM Corporation
 * All rights reserved.
 * This program and the accompanying materials
 * are made available under the terms of the BSD License
 * which accompanies this distribution, and is available at
 * http://www.opensource.org/licenses/bsd-license.php
 *
 * Contributors:
 *     IBM Corporation - initial implementation
 *****************************************************************************/

#ifndef _DHCP_H_
#define _DHCP_H_

#include <stdint.h>
#include "tftp.h"

/** \struct btphdr
 *  A header for BootP/DHCP-messages.
 *  For more information see RFC 951 / RFC 2131.
 */
struct btphdr {
	uint8_t op;          /**< Identifies is it request (1) or reply (2)    */
	uint8_t htype;       /**< HW address type (ethernet usually)           */
	uint8_t hlen;        /**< HW address length                            */
	uint8_t hops;        /**< This info used by relay agents (not used)    */
	uint32_t xid;        /**< This ID is used to match queries and replies */
	uint16_t secs;       /**< Unused                                       */
	uint16_t unused;     /**< Unused                                       */
	uint32_t ciaddr;     /**< Client IP address (if client knows it)       */
	uint32_t yiaddr;     /**< "Your" (client) IP address                   */
	uint32_t siaddr;     /**< Next server IP address (TFTP server IP)      */
	uint32_t giaddr;     /**< Gateway IP address (used by relay agents)    */
	uint8_t chaddr[16];  /**< Client HW address                            */
	uint8_t sname[64];   /**< Server host name (TFTP server name)          */
	uint8_t file[128];   /**< Boot file name                               */
	uint8_t vend[64];    /**< Optional parameters field (DHCP-options)     */
};

void dhcpv4_generate_transaction_id(void);
int bootp(char *ret_buffer, filename_ip_t *, unsigned int);
int dhcpv4(char *ret_buffer, filename_ip_t *);
void dhcp_send_release(int fd);

/* Handles DHCP-packets, which are detected by receive_ether. */
extern int8_t handle_dhcp(int fd, uint8_t * packet, int32_t packetsize);

#endif
