/*++

Copyright (c) 1998, Microsoft Corporation

Module Name:

    dhcpmsg.h

Abstract:

    This module contains declarations related to the DHCP allocator's
    message-processing.

Author:

    Abolade Gbadegesin (aboladeg)   6-Mar-1998

Revision History:

--*/

#ifndef _NATHLP_DHCPMSG_H_
#define _NATHLP_DHCPMSG_H_

//
// CONSTANT DECLARATIONS
//

#define DHCP_MAXIMUM_RENEWAL_TIME   (5 * 60)

#define DHCP_NBT_NODE_TYPE_B        1
#define DHCP_NBT_NODE_TYPE_P        2
#define DHCP_NBT_NODE_TYPE_M        4
#define DHCP_NBT_NODE_TYPE_H        8

//
// DHCP message format
//

#include <pshpack1.h>

//
// Disable "zero-sized array in struct/union" warning
//

#pragma warning(push)
#pragma warning(disable : 4200)

typedef struct _DHCP_OPTION {
    UCHAR Tag;
    UCHAR Length;
    UCHAR Option[];
} DHCP_OPTION, *PDHCP_OPTION;

typedef struct _DHCP_FOOTER {
    UCHAR Cookie[4];
} DHCP_FOOTER, *PDHCP_FOOTER;

typedef struct _DHCP_HEADER {
    UCHAR Operation;
    UCHAR HardwareAddressType;
    UCHAR HardwareAddressLength;
    UCHAR HopCount;
    ULONG TransactionId;
    USHORT SecondsSinceBoot;
    USHORT Flags;
    ULONG ClientAddress;
    ULONG AssignedAddress;
    ULONG BootstrapServerAddress;
    ULONG RelayAgentAddress;
    UCHAR HardwareAddress[16];
    UCHAR ServerHostName[64];
    UCHAR BootFile[128];
    DHCP_FOOTER Footer[];
} DHCP_HEADER, *PDHCP_HEADER;

#pragma warning(pop)

#include <poppack.h>


//
// MACRO DECLARATIONS
//

//
// BOOTP operation codes
//

#define BOOTP_OPERATION_REQUEST 1
#define BOOTP_OPERATION_REPLY   2

//
// BOOTP flags
//

#define BOOTP_FLAG_BROADCAST    0x0080

//
// BOOTP maximum option-area size
//

#define BOOTP_VENDOR_LENGTH     64

//
// Internal transaction ID for DHCP server detection
//

#define DHCP_DETECTION_TRANSACTION_ID   'MSFT'

//
// DHCP magic cookie
//

#define DHCP_MAGIC_COOKIE       ((99 << 24) | (83 << 16) | (130 << 8) | (99))
#define DHCP_MAGIC_COOKIE_SIZE  4

//
// DHCP option tag values
//

#define DHCP_TAG_PAD                    0
#define DHCP_TAG_SUBNET_MASK            1
#define DHCP_TAG_ROUTER                 3
#define DHCP_TAG_DNS_SERVER             6
#define DHCP_TAG_HOST_NAME              12
#define DHCP_TAG_DOMAIN_NAME            15
#define DHCP_TAG_STATIC_ROUTE           33
#define DHCP_TAG_WINS_SERVER            44
#define DHCP_TAG_NBT_NODE_TYPE          46
#define DHCP_TAG_NBT_SCOPE              47
#define DHCP_TAG_REQUESTED_ADDRESS      50
#define DHCP_TAG_LEASE_TIME             51
#define DHCP_TAG_OPTION_OVERLOAD        52
#define DHCP_TAG_MESSAGE_TYPE           53
#define DHCP_TAG_SERVER_IDENTIFIER      54
#define DHCP_TAG_PARAMETER_REQUEST_LIST 55
#define DHCP_TAG_ERROR_MESSAGE          56
#define DHCP_TAG_MAXIMUM_MESSAGE_SIZE   57
#define DHCP_TAG_RENEWAL_TIME           58
#define DHCP_TAG_REBINDING_TIME         59
#define DHCP_TAG_VENDOR_CLASS           60
#define DHCP_TAG_CLIENT_IDENTIFIER      61
#define DHCP_TAG_DYNAMIC_DNS            81
#define DHCP_TAG_END                    255

//
// Enumeration: DHCP_OPTION_INDEX
//
// The following enumerates the options of interest to the DHCP allocator.
// The enumeration aids in the processing of the options.
// (See 'DhcpExtractOptionsFromMessage').
//

typedef enum {
    DhcpOptionClientIdentifier,
    DhcpOptionMessageType,
    DhcpOptionRequestedAddress,
    DhcpOptionParameterRequestList,
    DhcpOptionErrorMessage,
    DhcpOptionDynamicDns,
    DhcpOptionHostName,
    DhcpOptionCount
} DHCP_OPTION_INDEX;

//
// DHCP message type values
//

#define DHCP_MESSAGE_BOOTP              0
#define DHCP_MESSAGE_DISCOVER           1
#define DHCP_MESSAGE_OFFER              2
#define DHCP_MESSAGE_REQUEST            3
#define DHCP_MESSAGE_DECLINE            4
#define DHCP_MESSAGE_ACK                5
#define DHCP_MESSAGE_NAK                6
#define DHCP_MESSAGE_RELEASE            7
#define DHCP_MESSAGE_INFORM             8


//
// IP/1394 support (RFC 2855)
//
#define IP1394_HTYPE                    0x18


//
// FUNCTION DECLARATIONS
//

ULONG
DhcpExtractOptionsFromMessage(
    PDHCP_HEADER Headerp,
    ULONG MessageSize,
    DHCP_OPTION UNALIGNED* OptionArray[]
    );

VOID
DhcpProcessBootpMessage(
    PDHCP_INTERFACE Interfacep,
    PNH_BUFFER Bufferp,
    DHCP_OPTION UNALIGNED* OptionArray[]
    );

VOID
DhcpProcessDiscoverMessage(
    PDHCP_INTERFACE Interfacep,
    PNH_BUFFER Bufferp,
    DHCP_OPTION UNALIGNED* OptionArray[]
    );

VOID
DhcpProcessInformMessage(
    PDHCP_INTERFACE Interfacep,
    PNH_BUFFER Bufferp,
    DHCP_OPTION UNALIGNED* OptionArray[]
    );

VOID
DhcpProcessMessage(
    PDHCP_INTERFACE Interfacep,
    PNH_BUFFER Bufferp
    );

VOID
DhcpProcessRequestMessage(
    PDHCP_INTERFACE Interfacep,
    PNH_BUFFER Bufferp,
    DHCP_OPTION UNALIGNED* OptionArray[]
    );

ULONG
DhcpWriteClientRequestMessage(
    PDHCP_INTERFACE Interfacep,
    PDHCP_BINDING Binding
    );

#endif // _NATHLP_DHCPMSG_H_