mirror of
https://github.com/azure-rtos/netx.git
synced 2023-08-10 07:57:54 +08:00
602 lines
32 KiB
C
602 lines
32 KiB
C
/**************************************************************************/
|
|
/* */
|
|
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
|
/* */
|
|
/* This software is licensed under the Microsoft Software License */
|
|
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
|
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
|
/* and in the root directory of this software. */
|
|
/* */
|
|
/**************************************************************************/
|
|
|
|
|
|
/**************************************************************************/
|
|
/**************************************************************************/
|
|
/** */
|
|
/** NetX Component */
|
|
/** */
|
|
/** Dynamic Host Configuration Protocol (DHCP) */
|
|
/** */
|
|
/**************************************************************************/
|
|
/**************************************************************************/
|
|
|
|
|
|
/**************************************************************************/
|
|
/* */
|
|
/* APPLICATION INTERFACE DEFINITION RELEASE */
|
|
/* */
|
|
/* nx_dhcp_server.h PORTABLE C */
|
|
/* 6.1.9 */
|
|
/* AUTHOR */
|
|
/* */
|
|
/* Yuxin Zhou, Microsoft Corporation */
|
|
/* */
|
|
/* DESCRIPTION */
|
|
/* */
|
|
/* This file defines the NetX Dynamic Host Configuration Protocol */
|
|
/* (DHCP) server component, including all data types and external */
|
|
/* references. It is assumed that nx_api.h and nx_port.h have already */
|
|
/* been included. */
|
|
/* */
|
|
/* RELEASE HISTORY */
|
|
/* */
|
|
/* DATE NAME DESCRIPTION */
|
|
/* */
|
|
/* 05-19-2020 Yuxin Zhou Initial Version 6.0 */
|
|
/* 09-30-2020 Yuxin Zhou Modified comment(s), and */
|
|
/* modified the type of */
|
|
/* nx_dhcp_user_options, */
|
|
/* improved buffer length */
|
|
/* verification, */
|
|
/* resulting in version 6.1 */
|
|
/* 10-15-2021 Yuxin Zhou Modified comment(s), included */
|
|
/* necessary header file, */
|
|
/* resulting in version 6.1.9 */
|
|
/* */
|
|
/**************************************************************************/
|
|
|
|
#ifndef NX_DHCP_SERVER_H
|
|
#define NX_DHCP_SERVER_H
|
|
|
|
/* Determine if a C++ compiler is being used. If so, ensure that standard
|
|
C is used to process the API information. */
|
|
|
|
#ifdef __cplusplus
|
|
|
|
/* Yes, C++ compiler is present. Use standard C. */
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
#include "nx_api.h"
|
|
|
|
/* Define the DHCP Server ID that is used to mark the DHCP Server structure as created. */
|
|
|
|
#define NX_DHCP_SERVER_ID 0x44484360UL
|
|
|
|
|
|
/* Define the DHCP stack size. */
|
|
|
|
#ifndef NX_DHCP_SERVER_THREAD_STACK_SIZE
|
|
#define NX_DHCP_SERVER_THREAD_STACK_SIZE 1024
|
|
#endif
|
|
|
|
|
|
/* Define the DHCP stack priority. */
|
|
|
|
#ifndef NX_DHCP_SERVER_THREAD_PRIORITY
|
|
#define NX_DHCP_SERVER_THREAD_PRIORITY 2
|
|
#endif
|
|
|
|
|
|
/* Define the DHCP packet allocation timeout in timer ticks. */
|
|
|
|
#ifndef NX_DHCP_PACKET_ALLOCATE_TIMEOUT
|
|
#define NX_DHCP_PACKET_ALLOCATE_TIMEOUT NX_IP_PERIODIC_RATE
|
|
#endif
|
|
|
|
|
|
/* Define UDP socket create options. */
|
|
|
|
#ifndef NX_DHCP_TYPE_OF_SERVICE
|
|
#define NX_DHCP_TYPE_OF_SERVICE NX_IP_NORMAL
|
|
#endif
|
|
|
|
#ifndef NX_DHCP_FRAGMENT_OPTION
|
|
#define NX_DHCP_FRAGMENT_OPTION NX_DONT_FRAGMENT
|
|
#endif
|
|
|
|
#ifndef NX_DHCP_TIME_TO_LIVE
|
|
#define NX_DHCP_TIME_TO_LIVE 0x80
|
|
#endif
|
|
|
|
#ifndef NX_DHCP_QUEUE_DEPTH
|
|
#define NX_DHCP_QUEUE_DEPTH 5
|
|
#endif
|
|
|
|
|
|
/* Define the server interface subnet mask (DHCP Client standard option). */
|
|
|
|
#ifndef NX_DHCP_SUBNET_MASK
|
|
#define NX_DHCP_SUBNET_MASK 0xFFFFFF00UL
|
|
#endif
|
|
|
|
|
|
|
|
/* Define the client's host name buffer size. */
|
|
|
|
#ifndef NX_DHCP_CLIENT_HOSTNAME_MAX
|
|
#define NX_DHCP_CLIENT_HOSTNAME_MAX 32
|
|
#endif
|
|
|
|
|
|
/* Define DHCP server's name and buffer size. */
|
|
#ifndef NX_DHCP_SERVER_HOSTNAME_MAX
|
|
#define NX_DHCP_SERVER_HOSTNAME_MAX 32
|
|
#endif
|
|
|
|
#ifndef NX_DHCP_SERVER_NAME
|
|
#define NX_DHCP_SERVER_NAME "NetX DHCP Server"
|
|
#endif
|
|
|
|
|
|
|
|
/* Define an interval in seconds for the session timer to check the time remaining on
|
|
all the active clients in the server database. */
|
|
|
|
#ifndef NX_DHCP_FAST_PERIODIC_TIME_INTERVAL
|
|
#define NX_DHCP_FAST_PERIODIC_TIME_INTERVAL 10
|
|
#endif
|
|
|
|
/* Set a length of time in seconds in which server can expect a client response during
|
|
Client DHCP session. Once a client is BOUND, the session timeout is set
|
|
to the IP address lease time. Note the maximum wait time between Client retransmissions
|
|
is 64 seconds, so this timeout should be in that neighborhood. Must be greater than
|
|
the fast periodic time interva. */
|
|
|
|
#ifndef NX_DHCP_CLIENT_SESSION_TIMEOUT
|
|
#define NX_DHCP_CLIENT_SESSION_TIMEOUT (10 * NX_DHCP_FAST_PERIODIC_TIME_INTERVAL)
|
|
#endif
|
|
|
|
|
|
/* Define an interval in seconds for the IP lease timer to check the time remaining on
|
|
all the assigned IP addresses in the server database. */
|
|
|
|
#ifndef NX_DHCP_SLOW_PERIODIC_TIME_INTERVAL
|
|
#define NX_DHCP_SLOW_PERIODIC_TIME_INTERVAL 1000
|
|
#endif
|
|
|
|
|
|
/* Set the default lease time in seconds on the IP address the server
|
|
will assign to the Client. */
|
|
|
|
#ifndef NX_DHCP_DEFAULT_LEASE_TIME
|
|
#define NX_DHCP_DEFAULT_LEASE_TIME (10 * NX_DHCP_SLOW_PERIODIC_TIME_INTERVAL)
|
|
#endif
|
|
|
|
|
|
|
|
/* Set a size of the Server option list requested by the Client. Since the NetX DHCP Server
|
|
does not as yet support the complete set of options in DHCP, this number can be optimized
|
|
down to a smaller size that the largest possible number of options a Client could request.
|
|
*/
|
|
|
|
#ifndef NX_DHCP_CLIENT_OPTIONS_MAX
|
|
#define NX_DHCP_CLIENT_OPTIONS_MAX 12
|
|
#endif
|
|
|
|
|
|
/* There are optional and required elements of the server option list.
|
|
Use the required plus the user configurable option list for the
|
|
server list to respond back to the client.
|
|
*/
|
|
|
|
/* At the very least, a DHCP server should supply the
|
|
Client's subnet mask, router (default gateway) address and dns server. This list must be
|
|
space separated. The combined required and optional server options
|
|
should be less than NX_DHCP_CLIENT_OPTIONS_MAX.
|
|
*/
|
|
|
|
#ifndef NX_DHCP_OPTIONAL_SERVER_OPTION_LIST
|
|
#define NX_DHCP_OPTIONAL_SERVER_OPTION_LIST "1 3 6"
|
|
#endif
|
|
|
|
/* Set the number of default options in the optional server list above. */
|
|
#ifndef NX_DHCP_OPTIONAL_SERVER_OPTION_SIZE
|
|
#define NX_DHCP_OPTIONAL_SERVER_OPTION_SIZE 3
|
|
#endif
|
|
|
|
|
|
/* The NetX DHCP Server includes its server identifier, message type in all messages. */
|
|
#define NX_DHCP_REQUIRED_SERVER_OPTION_LIST "53 54"
|
|
#define NX_DHCP_REQUIRED_SERVER_OPTION_SIZE 2
|
|
|
|
/* Compute the total option list size. */
|
|
#define NX_DHCP_SERVER_OPTION_LIST_SIZE (NX_DHCP_REQUIRED_SERVER_OPTION_SIZE + NX_DHCP_OPTIONAL_SERVER_OPTION_SIZE)
|
|
|
|
/* Combine the actual lists maintaining a space between all options. */
|
|
#define NX_DHCP_SERVER_OPTION_LIST NX_DHCP_REQUIRED_SERVER_OPTION_LIST \
|
|
" " \
|
|
NX_DHCP_OPTIONAL_SERVER_OPTION_LIST
|
|
|
|
|
|
/* Define the maximum size of each IP address list. Each interface the server assigns
|
|
IP addresses for will be limited to this size. */
|
|
|
|
/* Define the max size of an IP addresses list (applies to each interfaces). */
|
|
|
|
#ifndef NX_DHCP_IP_ADDRESS_MAX_LIST_SIZE
|
|
#define NX_DHCP_IP_ADDRESS_MAX_LIST_SIZE 20
|
|
#endif
|
|
|
|
/* Define the size of client record table (All clients e.g.on all interfaces). */
|
|
|
|
#ifndef NX_DHCP_CLIENT_RECORD_TABLE_SIZE
|
|
#define NX_DHCP_CLIENT_RECORD_TABLE_SIZE 50
|
|
#endif
|
|
|
|
/* END OF CONFIGURABLE OPTIONS */
|
|
|
|
|
|
/* Define the size of the BOOT buffer. This should be large enough for all the
|
|
required DHCP fields plus the minimum requirement of 312 bytes of option data
|
|
stated in RFC 2131; 2. Protocol Summary. */
|
|
#ifndef NX_BOOT_BUFFER_SIZE
|
|
#define NX_BOOT_BUFFER_SIZE 548
|
|
#endif
|
|
|
|
/* Define the size of the DHCP header as per RFC 213 Section Protocol Summery, page 10. */
|
|
|
|
#ifndef NX_DHCP_HEADER_SIZE
|
|
#define NX_DHCP_HEADER_SIZE 236
|
|
#endif
|
|
|
|
|
|
/*
|
|
Define the packet payload size, keeping in mind the DHCP Server must support
|
|
at least a 548 byte DHCP Client message as per RFC 2131 and allow room for Ethernet, UDP and
|
|
IP headers and 4 byte alignment.
|
|
*/
|
|
#ifndef NX_DHCP_MINIMUM_PACKET_PAYLOAD
|
|
#define NX_DHCP_MINIMUM_PACKET_PAYLOAD (NX_BOOT_BUFFER_SIZE + NX_PHYSICAL_HEADER + sizeof(NX_IP_HEADER) + sizeof(NX_UDP_HEADER))
|
|
#endif /* NX_DHCP_MINIMUM_PACKET_PAYLOAD */
|
|
|
|
|
|
/* Define the DHCP Message Area Offsets. The DHCP message format is identical to that of BootP, except
|
|
for the Vendor options that start at the offset specified by NX_DHCP_OFFSET_OPTIONS. */
|
|
|
|
#define NX_DHCP_OFFSET_OP 0 /* 1 BootP Operation 1=req, 2=reply */
|
|
#define NX_DHCP_OFFSET_HTYPE 1 /* 1 Hardware type 1 = Ethernet */
|
|
#define NX_DHCP_OFFSET_HLEN 2 /* 1 Hardware address length, 6 for Ethernet */
|
|
#define NX_DHCP_OFFSET_HOPS 3 /* 1 Number of hops, usually 0 */
|
|
#define NX_DHCP_OFFSET_XID 4 /* 4 Transaction ID, pseudo random number */
|
|
#define NX_DHCP_OFFSET_SECS 8 /* 2 Seconds since boot */
|
|
#define NX_DHCP_OFFSET_FLAGS 10 /* 2 Flags, 0x80 = Broadcast response, 0 = unicast response */
|
|
#define NX_DHCP_OFFSET_CLIENT_IP 12 /* 4 Initial client IP, used as dest for unicast response */
|
|
#define NX_DHCP_OFFSET_YOUR_IP 16 /* 4 Assigned IP, initialized to 0.0.0.0 */
|
|
#define NX_DHCP_OFFSET_SERVER_IP 20 /* 4 Server IP, usually initialized to 0.0.0.0 */
|
|
#define NX_DHCP_OFFSET_RELAY_IP 24 /* 4 Relay IP, usually 0.0.0.0, only for DHCP */
|
|
#define NX_DHCP_OFFSET_CLIENT_HW 28 /* 16 Client hardware address */
|
|
#define NX_DHCP_OFFSET_SERVER_NM 44 /* 64 Server name, nulls if unused */
|
|
#define NX_DHCP_OFFSET_BOOT_FILE 108 /* 128 Boot file name, null if unused */
|
|
#define NX_DHCP_OFFSET_VENDOR 236 /* 64 Vendor options, set first 4 bytes to a magic number */
|
|
#define NX_DHCP_OFFSET_OPTIONS 240 /* First variable vendor option */
|
|
#define NX_DHCP_OFFSET_END 300 /* End of BOOTP buffer */
|
|
#define NX_DHCP_SERVER_OPTION_ADDRESS_SIZE 4
|
|
|
|
/* Define the DHCP Specific Vendor Extensions. */
|
|
|
|
#define NX_DHCP_SERVER_OPTION_PAD 0
|
|
#define NX_DHCP_SERVER_OPTION_PAD_SIZE 0
|
|
#define NX_DHCP_SERVER_OPTION_SUBNET_MASK 1
|
|
#define NX_DHCP_SERVER_OPTION_SUBNET_MASK_SIZE NX_DHCP_SERVER_OPTION_ADDRESS_SIZE
|
|
#define NX_DHCP_SERVER_OPTION_TIME_OFFSET 2
|
|
#define NX_DHCP_SERVER_OPTION_TIME_OFFSET_SIZE 4
|
|
#define NX_DHCP_SERVER_OPTION_ROUTER 3
|
|
#define NX_DHCP_SERVER_OPTION_ROUTER_SIZE NX_DHCP_SERVER_OPTION_ADDRESS_SIZE
|
|
#define NX_DHCP_SERVER_OPTION_TIMESVR 4
|
|
#define NX_DHCP_SERVER_OPTION_DNS_SVR 6
|
|
#define NX_DHCP_SERVER_OPTION_HOST_NAME 12
|
|
#define NX_DHCP_SERVER_OPTION_DNS_NAME 15
|
|
#define NX_DHCP_SERVER_OPTION_NTP_SVR 42
|
|
#define NX_DHCP_SERVER_OPTION_VENDOR_OPTIONS 43
|
|
#define NX_DHCP_SERVER_OPTION_DHCP_IP_REQ 50
|
|
#define NX_DHCP_SERVER_OPTION_DHCP_IP_REQ_SIZE NX_DHCP_SERVER_OPTION_ADDRESS_SIZE
|
|
#define NX_DHCP_SERVER_OPTION_DHCP_LEASE 51
|
|
#define NX_DHCP_SERVER_OPTION_DHCP_LEASE_SIZE 4
|
|
#define NX_DHCP_SERVER_OPTION_DHCP_TYPE 53
|
|
#define NX_DHCP_SERVER_OPTION_DHCP_TYPE_SIZE 1
|
|
#define NX_DHCP_SERVER_OPTION_DHCP_SERVER_ID 54
|
|
#define NX_DHCP_SERVER_OPTION_DHCP_SERVER_SIZE NX_DHCP_SERVER_OPTION_ADDRESS_SIZE
|
|
#define NX_DHCP_SERVER_OPTION_DHCP_PARAMETERS 55
|
|
#define NX_DHCP_SERVER_OPTION_DHCP_MESSAGE 56
|
|
#define NX_DHCP_SERVER_OPTION_RENEWAL 58
|
|
#define NX_DHCP_SERVER_OPTION_RENEWAL_SIZE 4
|
|
#define NX_DHCP_SERVER_OPTION_REBIND 59
|
|
#define NX_DHCP_SERVER_OPTION_REBIND_SIZE 4
|
|
#define NX_DHCP_SERVER_OPTION_CLIENT_ID 61
|
|
#define NX_DHCP_SERVER_OPTION_CLIENT_ID_SIZE 7
|
|
#define NX_DHCP_SERVER_OPTION_FDQN 81
|
|
#define NX_DHCP_SERVER_OPTION_FDQN_FLAG_N 8
|
|
#define NX_DHCP_SERVER_OPTION_FDQN_FLAG_E 4
|
|
#define NX_DHCP_SERVER_OPTION_FDQN_FLAG_O 2
|
|
#define NX_DHCP_SERVER_OPTION_FDQN_FLAG_S 1
|
|
#define NX_DHCP_SERVER_OPTION_END 255
|
|
#define NX_DHCP_SERVER_OPTION_END_SIZE 0
|
|
|
|
#define NX_DHCP_MINIMUM_PACKET (NX_DHCP_OFFSET_END + NX_UDP_PACKET+ 100)
|
|
|
|
|
|
/* Define various BootP/DHCP constants. */
|
|
|
|
#define NX_DHCP_SERVER_UDP_PORT 67
|
|
#define NX_DHCP_SERVER_TCP_PORT 67
|
|
#define NX_DHCP_CLIENT_UDP_PORT 68
|
|
#define NX_DHCP_CLIENT_TCP_PORT 68
|
|
|
|
#define NX_DHCP_OP_REQUEST 1
|
|
#define NX_DHCP_OP_REPLY 2
|
|
#define NX_DHCP_FLAGS_BROADCAST 0x80
|
|
#define NX_DHCP_FLAGS_UNICAST 0x00
|
|
#define NX_DHCP_MAGIC_COOKIE IP_ADDRESS(99, 130, 83, 99)
|
|
#define NX_DHCP_NO_ADDRESS IP_ADDRESS(0, 0, 0, 0)
|
|
#define NX_DHCP_BC_ADDRESS IP_ADDRESS(255, 255, 255, 255)
|
|
#define NX_AUTO_IP_ADDRESS IP_ADDRESS(169, 254, 0, 0)
|
|
#define NX_AUTO_IP_ADDRESS_MASK 0xFFFF0000UL
|
|
#define NX_DHCP_SERVER_INFINITE_LEASE 0xFFFFFFFFUL
|
|
|
|
|
|
/* Define the DHCP Message Types. */
|
|
|
|
#define NX_DHCP_TYPE_DHCPDISCOVER 1
|
|
#define NX_DHCP_TYPE_DHCPOFFER 2
|
|
#define NX_DHCP_TYPE_DHCPREQUEST 3
|
|
#define NX_DHCP_TYPE_DHCPDECLINE 4
|
|
#define NX_DHCP_TYPE_DHCPACK 5
|
|
#define NX_DHCP_TYPE_DHCPNACK 6
|
|
#define NX_DHCP_TYPE_DHCPRELEASE 7
|
|
#define NX_DHCP_TYPE_DHCPINFORM 8
|
|
#define NX_DHCP_TYPE_DHCPFORCERENEW 9
|
|
#define NX_DHCP_TYPE_DHCPSILENT 10
|
|
|
|
|
|
/* Define the states of the DHCP state machine. */
|
|
|
|
#define NX_DHCP_STATE_BOOT 1 /* Started with a previous address */
|
|
#define NX_DHCP_STATE_INIT 2 /* Started with no previous address */
|
|
#define NX_DHCP_STATE_SELECTING 3 /* Waiting to identify a DHCP server */
|
|
#define NX_DHCP_STATE_REQUESTING 4 /* Address requested, waiting for the Ack */
|
|
#define NX_DHCP_STATE_BOUND 5 /* Address established, no time outs */
|
|
#define NX_DHCP_STATE_RENEWING 6 /* Address established, renewal time out */
|
|
#define NX_DHCP_STATE_REBINDING 7 /* Address established, renewal and rebind time out */
|
|
#define NX_DHCP_STATE_FORCERENEW 8 /* Address established, force renewal */
|
|
|
|
|
|
/* Define error codes from DHCP Server operation. */
|
|
|
|
#define NX_DHCP_SERVER_ALREADY_STARTED 0x90 /* DHCP Server already started */
|
|
#define NX_DHCP_SERVER_NOT_STARTED 0x91 /* DHCP Server not started when stop was issued */
|
|
#define NX_DHCP_PARAMETER_ERROR 0x92 /* Invalid non pointer input */
|
|
#define NX_DHCP_INADEQUATE_PACKET_POOL_PAYLOAD 0x93 /* DHCP Server packet pool has inadequate packet payload for DHCP messages. */
|
|
#define NX_DHCP_BAD_OPTION_LIST_ERROR 0x94 /* Server default option list has invalid characters. */
|
|
#define NX_DHCP_INTERNAL_OPTION_PARSE_ERROR 0x95 /* Internal error parsing options from string to ULONG. */
|
|
#define NX_DHCP_NO_SERVER_OPTION_LIST 0x96 /* Server default option list is empty when server is configured to use it. */
|
|
#define NX_DHCP_IMPROPERLY_TERMINATED_OPTION 0x97 /* Improperly formatted client option data e.g missing terminating symbol 0xFF. */
|
|
#define NX_DHCP_ADD_OPTION_ERROR 0x98 /* Unable to add option to buffer of server DHCP response packet */
|
|
#define NX_DHCP_INVALID_IP_ADDRESS_LIST 0x99 /* Invalid start or end IP address list parameter for creating assignable IP address list. */
|
|
#define NX_DHCP_NO_AVAILABLE_IP_ADDRESSES 0x9A /* Server has no available IP addresses for DHCP Clients */
|
|
#define NX_DHCP_INVALID_IP_ADDRESS 0x9B /* Invalid IP address e.g. null address received or obtained from client record. */
|
|
#define NX_DHCP_IP_ADDRESS_NOT_FOUND 0x9C /* No match found for IP address search */
|
|
#define NX_DHCP_IP_ADDRESS_ASSIGNED_TO_OTHER 0x9D /* IP address not assigned to the current client */
|
|
#define NX_DHCP_INVALID_UPDATE_ADDRESS_CMD 0x9E /* Unable to ascertain assigned ip address status (e.g. assign, mark available etc) */
|
|
#define NX_DHCP_CLIENT_RECORD_NOT_FOUND 0x9F /* Unable to find client in Client records table. */
|
|
#define NX_DHCP_CLIENT_TABLE_FULL 0xA0 /* Server unable to add record to client table; table is full. */
|
|
#define NX_DHCP_SERVER_BAD_INTERFACE_INDEX 0xA1 /* Interface index exceeds the NX_MAX_PHYSICAL_INTERFACES limit. */
|
|
#define NX_DHCP_INVALID_HW_ADDRESS 0xA2 /* Invalid hardware address e.g. null or exceeding 6 bytes. */
|
|
#define NX_DHCP_INVALID_NETWORK_PARAMETERS 0xA3 /* Invalid network parameters (subnet, dns server, default gateway/router). */
|
|
#define NX_DHCP_MALFORMED_DHCP_PACKET 0xA4 /* DHCP packet was malformed. */
|
|
|
|
|
|
/* Define DHCP Server event flags. These events are processed by the DHCP Server thread. */
|
|
#define NX_DHCP_SERVER_ALL_EVENTS 0xFFFFFFFFUL /* All DHCP Server event flags. */
|
|
#define NX_DHCP_SERVER_RECEIVE_EVENT 0x00000001UL /* Packet received event. */
|
|
#define NX_DHCP_SERVER_FAST_PERIODIC_EVENT 0x00000002UL /* Fast periodic timer event. */
|
|
#define NX_DHCP_SERVER_SLOW_PERIODIC_EVENT 0x00000004UL /* Slow periodic timer event. */
|
|
|
|
|
|
/* Define Assignable IP status 'commands'. */
|
|
|
|
#define NX_DHCP_ADDRESS_STATUS_NO_ACTION 0x01 /* No change in Client address. */
|
|
#define NX_DHCP_ADDRESS_STATUS_SERVER_ASSIGN 0x02 /* Server will assign IP address to client. */
|
|
#define NX_DHCP_ADDRESS_STATUS_ASSIGNED_EXT 0x03 /* Client assigned IP address elesewhere, mark client as owner and IP as not available. */
|
|
#define NX_DHCP_ADDRESS_STATUS_MARK_AVAILABLE 0x04 /* Mark client's IP address as available and clear owner field. */
|
|
#define NX_DHCP_ADDRESS_STATUS_ASSIGNED_OTHER 0x05 /* Mark client's IP address as assigned already (owner unknown). */
|
|
|
|
/* Define types of options to load in server response to DHCP client. */
|
|
|
|
#define NX_DHCP_OPTIONS_FOR_ALL_REPLIES 0x01
|
|
#define NX_DHCP_OPTIONS_FOR_REPLY_TO_OFFER 0x02
|
|
#define NX_DHCP_OPTIONS_FOR_REPLY_TO_REQUEST 0x03
|
|
#define NX_DHCP_OPTIONS_FOR_REPLY_TO_INFORM 0x04
|
|
#define NX_DHCP_OPTIONS_FOR_GENERIC_ACK 0x05
|
|
#define NX_DHCP_OPTIONS_REQUESTED_BY_CLIENT 0x06
|
|
|
|
/* Define the DHCP structure that contains DHCP client information during DHCP session. Note
|
|
this is not the same control block as the NX_DHCP_STRUCT in nx_dhcp.h for the NetX DHCP Client
|
|
package. */
|
|
|
|
typedef struct NX_DHCP_CLIENT_STRUCT
|
|
{
|
|
|
|
UINT nx_dhcp_client_state; /* Client DHCP state: e.g. INIT, BOOT, SELECTING, RENEWING etc */
|
|
UCHAR nx_dhcp_message_type; /* DHCP message type (DISCOVER, REQUEST etc) received from Client. */
|
|
CHAR nx_dhcp_client_name[NX_DHCP_CLIENT_HOSTNAME_MAX];
|
|
/* DHCP Client host name buffer. */
|
|
ULONG nx_dhcp_xid; /* Transaction ID for client DHCP session */
|
|
ULONG nx_dhcp_source_ip_address; /* Source IP of the client DHCP message. */
|
|
ULONG nx_dhcp_destination_ip_address;
|
|
/* Destination IP of the client DHCP message. */
|
|
ULONG nx_dhcp_clientip_address; /* "Client IP address" (sometimes called "ci-addr" field). */
|
|
ULONG nx_dhcp_your_ip_address; /* "Your IP address" field in client DHCP message. */
|
|
ULONG nx_dhcp_requested_ip_address;/* IP address requested in client message option. */
|
|
ULONG nx_dhcp_requested_lease_time;/* IP address lease time requested in client message option. */
|
|
ULONG nx_dhcp_assigned_ip_address; /* IP address the Server offers/assigns the client. */
|
|
UINT nx_dhcp_client_iface_index; /* Index into the server interface table matching the DHCP client's packet interface. */
|
|
ULONG nx_dhcp_clientrec_server_ip; /* Next Server IP Address (may be another DHCP server) for advanced DHCP features */
|
|
ULONG nx_dhcp_server_id; /* Requested/assigned Server ID (usually set to DHCP server IP address) */
|
|
ULONG nx_dhcp_router_ip_address; /* Requested/assigned router on DHCP Client network. */
|
|
ULONG nx_dhcp_dns_ip_address; /* Requested/assigned DNS IP address; usually set to zero. */
|
|
ULONG nx_dhcp_relay_ip_address; /* Requested/assigned Relay IP address; usually set to zero. */
|
|
ULONG nx_dhcp_subnet_mask; /* Requested/assigned network mask */
|
|
ULONG nx_dhcp_client_mac_msw; /* Client MAC address high bits */
|
|
ULONG nx_dhcp_client_mac_lsw; /* Client MAC address low bits */
|
|
UINT nx_dhcp_client_hwlen; /* Length of hardware address. */
|
|
UINT nx_dhcp_client_hwtype; /* Client interface hardware type e.g. Ethernet. */
|
|
ULONG nx_dhcp_broadcast_flag_set; /* Parse broadcast flags from DHCP messages. */
|
|
UINT nx_dhcp_client_option_count; /* Number of user options in client request */
|
|
UCHAR nx_dhcp_user_options[NX_DHCP_CLIENT_OPTIONS_MAX];
|
|
ULONG nx_dhcp_session_timeout; /* Time out on waiting for client's next response */
|
|
UINT nx_dhcp_response_type_to_client;
|
|
/* DHCP code for response to send back to client. */
|
|
|
|
} NX_DHCP_CLIENT;
|
|
|
|
/* Define the interface address structure which the server will use to assign IP addresses
|
|
in a previously specified network interface. */
|
|
typedef struct NX_DHCP_INTERFACE_IP_ADDRESS_STRUCT
|
|
{
|
|
ULONG nx_assignable_ip_address; /* IP address available to assign to DHCP Client. */
|
|
UINT assigned; /* IP address status e.g if currently assigned to a client host. */
|
|
UINT lease_time; /* Lease duration in secs. */
|
|
UINT owner_hwtype; /* Hardware type. */
|
|
UINT owner_mac_msw; /* MAC address high bits. */
|
|
UINT owner_mac_lsw; /* MAC address low bits. */
|
|
} NX_DHCP_INTERFACE_IP_ADDRESS;
|
|
|
|
|
|
typedef struct NX_DHCP_INTERFACE_TABLE_STRUCT
|
|
{
|
|
NX_DHCP_INTERFACE_IP_ADDRESS
|
|
nx_dhcp_ip_address_list[NX_DHCP_IP_ADDRESS_MAX_LIST_SIZE];
|
|
/* IP address available to assign to DHCP Client. */
|
|
NX_INTERFACE *nx_dhcp_incoming_interface; /* Pointer to DHCP Server interface. */
|
|
ULONG nx_dhcp_server_ip_address; /* DHCP Server's IP address for this interface. */
|
|
ULONG nx_dhcp_dns_ip_address; /* DHCP server DNS Server Address in message to DHCP Client.. */
|
|
ULONG nx_dhcp_subnet_mask; /* DHCP server interface subnet mask. */
|
|
ULONG nx_dhcp_subnet; /* DHCP server interface subnet. */
|
|
ULONG nx_dhcp_router_ip_address; /* The router IP Address for DHCP client configuration */
|
|
UINT nx_dhcp_address_list_size; /* Actual number of assignable addresses for this interface. */
|
|
|
|
} NX_DHCP_INTERFACE_TABLE;
|
|
|
|
/* Define the Interface address list. */
|
|
|
|
/* Define the DHCP structure that contains all the server information necessary for this DHCP
|
|
instance. */
|
|
|
|
typedef struct NX_DHCP_SERVER_STRUCT
|
|
{
|
|
ULONG nx_dhcp_id; /* DHCP thread ID */
|
|
CHAR *nx_dhcp_name; /* DHCP server name */
|
|
NX_PACKET_POOL *nx_dhcp_packet_pool_ptr; /* Pointer to DHCP server packet pool */
|
|
TX_TIMER nx_dhcp_slow_periodic_timer; /* Timer for watching IP lease time outs. */
|
|
TX_TIMER nx_dhcp_fast_periodic_timer; /* Timer for watching session time outs. */
|
|
UCHAR nx_dhcp_started; /* DHCP started flag */
|
|
NX_IP *nx_dhcp_ip_ptr; /* The Server IP Instance */
|
|
TX_THREAD nx_dhcp_server_thread; /* The DHCP server processing thread */
|
|
TX_MUTEX nx_dhcp_mutex; /* Mutex protection for client and interface tables. */
|
|
TX_EVENT_FLAGS_GROUP nx_dhcp_server_events; /* DHCP Server events. */
|
|
UINT nx_dhcp_number_clients; /* Number of clients currently assigned IP address by this server. */
|
|
NX_DHCP_CLIENT client_records[NX_DHCP_CLIENT_RECORD_TABLE_SIZE]; /* Table of DHCP clients.*/
|
|
/* List of IP addresses server can assign to DHCP Clients */
|
|
NX_UDP_SOCKET nx_dhcp_socket; /* DHCP server socket to receive DHCP messages on its interfaces. */
|
|
UINT nx_dhcp_server_options[NX_DHCP_SERVER_OPTION_LIST_SIZE];
|
|
/* List of max number of options in supply data to Client */
|
|
UINT nx_dhcp_server_option_count; /* Actual number of options the server is supplying back to client. */
|
|
|
|
NX_DHCP_INTERFACE_TABLE nx_dhcp_interface_table[NX_MAX_PHYSICAL_INTERFACES];
|
|
/* Interface specific table of addresses available for DHCP clients. */
|
|
ULONG nx_dhcp_discoveries_received; /* The number of Discovery messages received */
|
|
ULONG nx_dhcp_requests_received; /* The number of Request messages received */
|
|
ULONG nx_dhcp_informs_received; /* The number of Inform messages received */
|
|
ULONG nx_dhcp_declines_received; /* The number of Decline messages received */
|
|
ULONG nx_dhcp_releases_received; /* The number of Release messages received */
|
|
|
|
} NX_DHCP_SERVER;
|
|
|
|
|
|
#ifndef NX_DHCP_SERVER_SOURCE_CODE
|
|
|
|
/* Application caller is present, perform API mapping. */
|
|
|
|
/* Determine if error checking is desired. If so, map DHCP API functions
|
|
to the appropriate error checking front-ends. Otherwise, map API
|
|
functions to the core functions that actually perform the work.
|
|
Note: error checking is enabled by default. */
|
|
|
|
#ifdef NX_DISABLE_ERROR_CHECKING
|
|
|
|
/* Services without error checking. */
|
|
|
|
#define nx_dhcp_server_create _nx_dhcp_server_create
|
|
#define nx_dhcp_create_server_ip_address_list _nx_dhcp_create_server_ip_address_list
|
|
#define nx_dhcp_set_interface_network_parameters _nx_dhcp_set_interface_network_parameters
|
|
#define nx_dhcp_server_delete _nx_dhcp_server_delete
|
|
#define nx_dhcp_server_start _nx_dhcp_server_start
|
|
#define nx_dhcp_server_stop _nx_dhcp_server_stop
|
|
#define nx_dhcp_clear_client_record _nx_dhcp_clear_client_record
|
|
|
|
#else
|
|
|
|
/* Services with error checking. */
|
|
|
|
#define nx_dhcp_server_create _nxe_dhcp_server_create
|
|
#define nx_dhcp_create_server_ip_address_list _nxe_dhcp_create_server_ip_address_list
|
|
#define nx_dhcp_set_interface_network_parameters _nxe_dhcp_set_interface_network_parameters
|
|
#define nx_dhcp_server_delete _nxe_dhcp_server_delete
|
|
#define nx_dhcp_server_start _nxe_dhcp_server_start
|
|
#define nx_dhcp_server_stop _nxe_dhcp_server_stop
|
|
#define nx_dhcp_clear_client_record _nxe_dhcp_clear_client_record
|
|
#endif
|
|
|
|
/* Define the prototypes accessible to the application software. */
|
|
|
|
UINT nx_dhcp_server_create(NX_DHCP_SERVER *dhcp_ptr, NX_IP *ip_ptr, VOID *stack_ptr, ULONG stack_size, CHAR *name_ptr, NX_PACKET_POOL *packet_pool);
|
|
UINT nx_dhcp_create_server_ip_address_list(NX_DHCP_SERVER *dhcp_ptr, UINT iface_index, ULONG start_ip_address, ULONG end_ip_address, UINT *addresses_added);
|
|
UINT nx_dhcp_set_interface_network_parameters(NX_DHCP_SERVER *dhcp_ptr, UINT iface_index, ULONG subnet_mask, ULONG default_gateway_address, ULONG dns_server_address);
|
|
UINT nx_dhcp_server_delete(NX_DHCP_SERVER *dhcp_ptr);
|
|
UINT nx_dhcp_server_start(NX_DHCP_SERVER *dhcp_ptr);
|
|
UINT nx_dhcp_server_stop(NX_DHCP_SERVER *dhcp_ptr);
|
|
UINT nx_dhcp_clear_client_record(NX_DHCP_SERVER *dhcp_ptr, NX_DHCP_CLIENT *dhcp_client_ptr);
|
|
|
|
#else
|
|
|
|
/* DHCP source code is being compiled, do not perform any API mapping. */
|
|
|
|
|
|
UINT _nxe_dhcp_server_create(NX_DHCP_SERVER *dhcp_ptr, NX_IP *ip_ptr, VOID *stack_ptr, ULONG stack_size, CHAR *name_ptr, NX_PACKET_POOL *packet_pool);
|
|
UINT _nx_dhcp_server_create(NX_DHCP_SERVER *dhcp_ptr, NX_IP *ip_ptr, VOID *stack_ptr, ULONG stack_size, CHAR *name_ptr, NX_PACKET_POOL *packet_pool);
|
|
UINT _nx_dhcp_create_server_ip_address_list(NX_DHCP_SERVER *dhcp_ptr, UINT iface_index, ULONG start_ip_address, ULONG end_ip_address, UINT *addresses_added);
|
|
UINT _nxe_dhcp_create_server_ip_address_list(NX_DHCP_SERVER *dhcp_ptr, UINT iface_index, ULONG start_ip_address, ULONG end_ip_address, UINT *addresses_added);
|
|
UINT _nxe_dhcp_set_interface_network_parameters(NX_DHCP_SERVER *dhcp_ptr, UINT iface_index, ULONG subnet_mask, ULONG default_gateway_address, ULONG dns_server_address);
|
|
UINT _nx_dhcp_set_interface_network_parameters(NX_DHCP_SERVER *dhcp_ptr, UINT iface_index, ULONG subnet_mask, ULONG default_gateway_address, ULONG dns_server_address);
|
|
UINT _nxe_dhcp_server_delete(NX_DHCP_SERVER *dhcp_ptr);
|
|
UINT _nx_dhcp_server_delete(NX_DHCP_SERVER *dhcp_ptr);
|
|
UINT _nxe_dhcp_server_start(NX_DHCP_SERVER *dhcp_ptr);
|
|
UINT _nx_dhcp_server_start(NX_DHCP_SERVER *dhcp_ptr);
|
|
UINT _nxe_dhcp_server_stop(NX_DHCP_SERVER *dhcp_ptr);
|
|
UINT _nx_dhcp_server_stop(NX_DHCP_SERVER *dhcp_ptr);
|
|
UINT _nxe_dhcp_clear_client_record(NX_DHCP_SERVER *dhcp_ptr, NX_DHCP_CLIENT *dhcp_client_ptr);
|
|
UINT _nx_dhcp_clear_client_record(NX_DHCP_SERVER *dhcp_ptr, NX_DHCP_CLIENT *dhcp_client_ptr);
|
|
|
|
|
|
#endif
|
|
|
|
/* Determine if a C++ compiler is being used. If so, complete the standard
|
|
C conditional started above. */
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif /* __cplusplus */
|
|
|
|
#endif /* NX_DHCP_SERVER_H */
|