第 2 章 - 安装和使用 Azure RTOS NetX Duo DHCP 客户端

本章包含与安装、设置和使用 Azure RTOS NetX Duo DHCP 客户端组件相关的各种问题的说明。

产品分发

可以从我们的公共源代码存储库获取 Azure RTOS NetX Duo,网址为:https://github.com/azure-rtos/netxduo。 该软件包中包含以下文件:

  • nxd_dhcp_client.h:NetX Duo DHCP 的头文件
  • nxd_dhcp_client.c:DHCP NetX Duo 的 C 源文件
  • nxd_dhcp_client.pdf:NetX Duo DHCP 的用户指南
    • demo_netxduo_dhcp.c:NetX Duo DHCP 客户端演示
    • demo_netxduo_multihome_dhcp_client.c:在多个接口上运行 DHCP 的 NetX Duo DHCP 客户端演示

DHCP 安装

若要使用 NetX Duo DHCP 客户端,应将前面提到的整个分发包复制到 NetX Duo 所安装的目录中。 例如,如果 NetX Duo 安装在“\threadx\arm7\green”目录中,则应将 nxd_dhcp_client.h 和 nxd_dhcp_client.c 文件复制到该目录中。

使用 DHCP

使用适用于 NetX Duo 的 DHCP 非常简单。 总体上,应用程序代码必须先包含 tx_api.h 和 nx_api.h,然后包含 nxd_dhcp_client.h,才能分别使用 ThreadX 和 NetX Duo。 在包含 nxd_dhcp_client.h 之后,应用程序代码即可进行本指南后文所指定的 DHCP 函数调用。 应用程序还必须在生成过程中包含 nxd_dhcp_client.c。 此文件必须采用与其他应用程序文件相同的方式进行编译,并且其对象窗体必须与应用程序文件一起链接。 这就是使用 NetX DHCP 所需的一切。

请注意,由于 DHCP 利用 NetX Duo UDP 服务,因此在使用 DHCP 之前,必须通过 nx_udp_enable 调用启用 UDP。

若要获取先前分配的 IP 地址,DHCP 客户端可以使用“请求”消息和选项 50“请求的 IP 地址”针对 DHCP 服务器启动 DHCP 进程。 如果 DHCP 服务器授予 IP 地址给客户端,则会以 ACK 消息响应,否则以 NACK 响应。 在后一种情况下,DHCP 客户端会使用“发现”消息而不使用所请求 IP 地址,以 Init 状态重新启动 DHCP 进程。 主机应用程序会先创建 DHCP 客户端,然后调用 nx_dhcp_request_client_ip API 服务以设置所请求的 IP 地址,再使用 nx_dhcp_start 启动 DHCP 进程。 如需更多详细信息,请参阅本文档其他位置提供的示例 DHCP 应用程序。

处于绑定状态

当 DHCP 客户端处于绑定状态时,DHCP 客户端线程在 NX_DHCP_TIME_INTERVAL 所指定的每个时间间隔会处理一次客户端状态,并减少分配给客户端的 IP 租约的剩余时间。 续订时间经过后,DHCP 客户端状态就会更新为 RENEW 状态,客户端随即向 DHCP 服务器请求续订。

将 DHCP 消息发送至服务器

DHCP 客户端具备 API 服务,可供主机应用程序用来将消息发送至 DHCP 服务器。 请注意,这些服务并不打算让主机应用程序手动运行 DHCP 客户端协议。

  • nx_dhcp_release:当主机应用程序离开网络或需要放弃其 IP 地址时,此服务会将一条 RELEASE 消息发送至服务器。
  • nx_dhcp_decline:如果主机应用程序独立于 DHCP 客户端确定其 IP 地址已在使用中,则此服务会将一条 DECLINE 消息发送至服务器。
  • nx_dhcp_forcerenew:此服务将 FORCERENEW 消息发送至服务器。
  • nx_dhcp_send_request:此服务使用 nxd_dhcp_client.h 中指定的 DHCP 消息类型作为参数,将消息发送至服务器。 此服务主要用于发送 DHCP INFORM 消息。

有关这些服务的详细信息,请参阅DHCP 服务说明

启动和停止 DHCP 客户端

若要停止 DHCP 客户端,而不考虑其是否已达到绑定状态,主机应用程序可调用 nx_dhcp_stop。

若要重新启动 DHCP 客户端,主机应用程序必须先使用上述 nx_dhcp_stop 服务停止 DHCP 客户端。 然后,主机应用程序可以调用 nx_dhcp_start 来恢复 DHCP 客户端。 如果主机应用程序希望清除先前的 DHCP 客户端配置文件(例如,从另一网络上先前的 DHCP 服务器获取的配置文件),则应先调用 nx_dhcp_reinitialize 以内部方式执行此任务,然后再调用 nx_dhcp_start。

典型的序列可能是:

nx_dhcp_stop(&my_dhcp);
nx_dhcp_reinitialize(&my_dhcp);
nx_dhcp_start(&my_dhcp);

对于仅在单个 DHCP 接口上运行的 DHCP 应用程序,停止 DHCP 客户端还会停用 DHCP 客户端计时器, 因此不再跟踪 IP 租约的剩余时间。 在特定接口上停止 DHCP 客户端不会停用 DHCP 客户端计时器,但会停止计时器更新该接口上 IP 租约的剩余时间。

因此,除非主机应用程序需要重新启动或切换网络,否则不建议停止 DHCP 客户端。

将 DHCP 客户端与 Auto IP 配合使用

在 DHCP 和 Auto IP 可以保证提供地址,而 DHCP 服务器无法保证可用或有响应的应用程序中,NetX Duo DHCP 客户端与 Auto IP 协议并行工作。 但是,如果主机无法检测到服务器或者获分配 IP 地址,则可以切换到 Auto IP 协议以获取本地 IP 地址。 不过,这样做之前,建议在 Auto IP 经历“探测”和“防御”阶段期间暂时停止 DHCP 客户端。 主机获分配 Auto IP 地址后,就可以重新启动 DHCP 客户端,如果 DHCP 服务器变为可用,则主机 IP 地址可以接受 DHCP 服务器在应用程序运行期间提供的 IP 地址。

NetX Duo Auto IP 有地址更改通知,可供主机在 IP 地址更改时监视其活动。

数据包链接

为更有效地使用数据包池和内存资源,DHCP 客户端可以处理从以太网驱动程序传入的链式数据包(超过驱动程序 MTU 的数据报)。 如果驱动程序具有此功能,应用程序可将接收数据包的数据包池设置为低于必需的 NX_DHCP_PACKET_PAYLOAD 字节数。 NX_DHCP_PACKET_PAYLOAD 应适应物理网络(通常为以太网)帧,加上 548 个字节的 DHCP 消息数据以及 IP 和 UDP。

请注意,应用程序可以优化数据包有效负载以及数据包池中的数据包数量,其中,数据包池是 DHCP 客户端的一部分,用于发送 DHCP 消息。应用程序可以根据 DHCP 客户端消息的预期使用情况及大小来优化大小。

小型示例系统

下面的图 1.1 显示使用 NetX Duo 的方式示例。 应用程序线程入口函数“my_thread_entry”在第 101 行创建。 创建成功之后,在第 108 行使用 nx_dhcp_start 调用启动 DHCP 处理。 此时,DHCP 客户端线程任务会单独尝试联系 DHCP 服务器。 在此过程中,应用程序代码在第 95 行使用 nx_ip_status_check 服务(若为辅助接口,则使用 nx_ip_interface_status_check)等待有效的 IP 地址向该 IP 实例注册。 此操作通常在使用较短等待选项的循环中完成。

在第 127 行之后,DHCP 已接收到有效的 IP 地址,应用程序可以继续操作,根据需要使用 NetX Duo TCP/IP 服务。

#include   "tx_api.h"
#include   "nx_api.h"
#include   "nxd_dhcp_client.h"

#define     DEMO_STACK_SIZE         4096
TX_THREAD               my_thread;
NX_PACKET_POOL          my_pool;
NX_IP                   my_ip;
NX_DHCP                 my_dhcp;

/* Define function prototypes.  */

void    my_thread_entry(ULONG thread_input);
void    my_netx_driver(struct NX_IP_DRIVER_STRUCT *driver_req);

/* Define main entry point.  */
intmain()
{
  /* Enter the ThreadX kernel.  */
  tx_kernel_enter();
}

/* Define what the initial system looks like.  */
void    tx_application_define(void *first_unused_memory)
{

CHAR    *pointer;
UINT    status;
    
    /* Setup the working pointer.  */
    pointer =  (CHAR *) first_unused_memory;

    /* Create “my_thread”.  */
 	  tx_thread_create(&my_thread, "my thread", my_thread_entry, 0,  
		                pointer, DEMO_STACK_SIZE, 2, 2, 
                        TX_NO_TIME_SLICE, TX_AUTO_START);
    pointer =  pointer + DEMO_STACK_SIZE;

    /* Initialize the NetX Duo system.  */
    nx_system_initialize();

    /* Create a packet pool.  */
    status =  nx_packet_pool_create(&my_pool, "NetX Main Packet Pool", 
                                     1024, pointer, 64000);
    pointer = pointer + 64000;

    /* Check for pool creation error.  */
    if (status)
        error_counter++;

    /* Create an IP instance without an IP address. */
    status = nx_ip_create(&my_ip, "My NetX IP Instance", IP_ADDRESS(0,0,0,0), 
                          0xFFFFFF00, &my_pool, my_netx_driver, pointer, 
                          DEMO_STACK_SIZE, 1);
    pointer =  pointer + DEMO_STACK_SIZE;

    /* Check for IP create errors.  */
    if (status)
        error_counter++;

    /* Enable ARP and supply ARP cache memory for my IP Instance.  */
    status =  nx_arp_enable(&my_ip, (void *) pointer, 1024);
    pointer = pointer + 1024;

    /* Check for ARP enable errors.  */
    if (status)
        error_counter++;

    /* Enable UDP.  */
    status =  nx_udp_enable(&my_ip);
    if (status)
        error_counter++;
 }


 /* Define my thread.  */

 void    my_thread_entry(ULONG thread_input)
 {

 UINT        status;
 ULONG       actual_status;
 NX_PACKET   *my_packet;

    /* Wait for the link to come up.  */
    do
    {
    /* Get the link status.  */
        status =  nx_ip_status_check(&my_ip, NX_IP_LINK_ENABLED, 
                                     &actual_status, 100);
    } while (status != NX_SUCCESS);

    /* Create a DHCP instance.  */
    status =  nx_dhcp_create(&my_dhcp, &my_ip, "My DHCP");

    /* Check for DHCP create error.  */
    if (status)
        error_counter++;

    /* Start DHCP.  */
    nx_dhcp_start(&my_dhcp);

    /* Check for DHCP start error.  */
    if (status)
        error_counter++;

    /* Wait for IP address to be resolved through DHCP.  */
    nx_ip_status_check(&my_ip, NX_IP_ADDRESS_RESOLVED, 
                       (ULONG *) &status, 100000);

    /* Check to see if we have a valid IP address.  */
    if (status)
    {
      error_counter++;
      return;
    }
    else
    {

  /* Yes, a valid IP address is now on lease…  All NetX Duo
        services are available.
    }
 }

多服务器环境

在有多台 DHCP 服务器的网络上,DHCP 客户端会接受其收到的第一条 DHCP 服务器 Offer 消息,进入“请求”状态,并忽略所收到的任何其他 Offer 消息。

ARP 探测

DHCP 客户端可以进行配置,在 DHCP 服务器进行 IP 地址分配后发送一个或多个 ARP 探测,验证该 IP 地址是否尚未使用。 RFC 2131 建议使用 ARP 探测步骤,此步骤在有多台 DHCP 服务器的环境中尤为重要。 如果主机应用程序启用 NX_DHCP_CLIENT_SEND_ARP_PROBE 选项(请参阅第二章中的“配置选项”了解其他 ARP 探测选项),则 DHCP 客户端会发送“自寻址”ARP 探测,并等待指定的时间来获得响应。 如果未收到任何响应,则 DHCP 客户端会前进到“绑定”状态。 如果收到响应,则 DHCP 客户端会假设该地址已在使用中。 它会自动发送一条 DECLINE 消息给服务器,并重新初始化客户端,再次从 INIT 状态重新启动 DHCP 探测。 这将重新启动 DHCP 状态机,并且客户端会发送另一条 DISCOVER 消息给服务器。

BOOTP 协议

DHCP 客户端还支持 BOOTP 协议和 DHCP 协议。 若要启用此选项并使用 BOOTP 代替 DHCP,主机应用程序必须设置 NX_DHCP_BOOTP_ENABLE 配置选项。 使用 BOOTP 协议时,主机应用程序仍可请求特定的 IP 地址。 不过,有别于 BOOTP 有时用来加载主机操作系统,DHCP 客户端不支持该加载。

辅助接口上的 DHCP

NetX Duo DHCP 客户端可以在辅助接口而不是默认的主接口上运行。

若要在辅助网络接口上运行 NetX Duo DHCP 客户端,主机应用程序必须使用 nx_dhcp_set_interface_index API 服务,将 DHCP 客户端的接口索引设置为辅助接口。 该接口必须已使用 nx_ip_interface_attach 服务来连接到主网络接口。 有关连接辅助接口的详细信息,请参阅《NetX Duo 用户指南》。

下面是一个示例系统(图 1.2),其中,主机应用程序连接至 DHCP 服务器上的辅助接口。 在第 65 行,该辅助接口连接至 IP 地址为 Null 的 IP 任务。 在第 104 行,创建 DHCP 客户端实例之后,通过调用 nx_dhcp_set_interface_index,将 DHCP 客户端接口索引设置为 1(即,与自身索引为 0 的主接口的偏移量)。 然后,DHCP 客户端已准备就绪,可以在第 108 行启动。

#include   "tx_api.h"
#include   "nx_api.h"
#include   "nxd_dhcp_client.h"

#define     DEMO_STACK_SIZE         4096
TX_THREAD               my_thread;
NX_PACKET_POOL          my_pool;
NX_IP                   my_ip;
NX_DHCP                 my_dhcp;

/* Define function prototypes.  */

void    my_thread_entry(ULONG thread_input);
void    my_netx_driver(struct NX_IP_DRIVER_STRUCT *driver_req);

/* Define main entry point.  */

intmain()
{
  /* Enter the ThreadX kernel.  */
  tx_kernel_enter();
}


/* Define what the initial system looks like.  */

void    tx_application_define(void *first_unused_memory)
{

CHAR    *pointer;
UINT    status;

    /* Setup the working pointer.  */
    pointer =  (CHAR *) first_unused_memory;

    /* Create “my_thread”.  */
    tx_thread_create(&my_thread, "my thread", my_thread_entry, 0,  
                      pointer, DEMO_STACK_SIZE, 
                      2, 2, TX_NO_TIME_SLICE, TX_AUTO_START);
    pointer =  pointer + DEMO_STACK_SIZE;

    /* Initialize the NetX Duo system.  */
    nx_system_initialize();

  /* Create a packet pool.  */
    status =  nx_packet_pool_create(&my_pool, "NetX Main Packet Pool", 
                                     1024, pointer, 64000);
    pointer = pointer + 64000;

    /* Check for pool creation error.  */
    if (status)
        error_counter++;

    /* Create an IP instance without an IP address. */
    status = nx_ip_create(&my_ip, "My NetX IP Instance", IP_ADDRESS(0,0,0,0), 
                           0xFFFFFF00, &my_pool, my_netx_driver, pointer, STACK_SIZE, 1);
    pointer =  pointer + DEMO_STACK_SIZE;

    /* Check for IP create errors.  */
    if (status)
        error_counter++;

    status =  _nx_ip_interface_attach(&ip_0, "port_2", IP_ADDRESS(0, 0, 0,0), 
                                       0xFFFFFF00UL, my_netx_driver);

    /* Enable ARP and supply ARP cache memory for my IP Instance.  */
    status =  nx_arp_enable(&my_ip, (void *) pointer, 1024);
    pointer = pointer + 1024;

    /* Check for ARP enable errors.  */
    if (status)
        error_counter++;

    /* Enable UDP.  */
    status =  nx_udp_enable(&my_ip);
    if (status)
        error_counter++;
}


void    my_thread_entry(ULONG thread_input)
{

UINT        status;
ULONG       status;
NX_PACKET   *my_packet;

    /* Wait for the link to come up.  */
    do
    {
      /* Get the link status.  */
        status =  nx_ip_status_check(&my_ip,NX_IP_LINK_ENABLED,& status,100);
    } while (status != NX_SUCCESS);

    /* Create a DHCP instance.  */
    status =  nx_dhcp_create(&my_dhcp, &my_ip, "My DHCP");

    /* Check for DHCP create error.  */
    if (status)
        error_counter++;

    /* Set the DHCP client interface to the secondary interface. */
    status = nx_dhcp_set_interface_index(&my_dhcp, 1);


    /* Start DHCP.  */
    nx_dhcp_start(&my_dhcp);

    /* Check for DHCP start error.  */
    if (status)
        error_counter++;

    /* Wait for IP address to be resolved through DHCP.  */
    nx_ip_status_check(&my_ip, NX_IP_ADDRESS_RESOLVED, 
                       (ULONG *) &status, 100000);

    /* Check to see if we have a valid IP address.  */
    if (status)
    {
        error_counter++;
        return;
    }
    else
    {
    /* Yes, a valid IP address is now on lease…  All NetX Duo
        services are available.*/
    }
}

同时在多个接口上运行的 DHCP 客户端

若要在多个接口上运行 DHCP 客户端,nx_api.h 中的 NX_MAX_PHYSICAL_INTERFACES 必须设置为连接至设备的物理接口数。 默认情况下,此值为 1(即,主接口)。 若要向该 IP 实例注册其他接口,请使用 nx_ip_interface_attach 服务。 有关连接辅助接口的详细信息,请参阅《NetX Duo 用户指南》。

下一步是将 nxd_dhcp_client.h 中的 NX_DHCP_CLIENT_MAX_RECORDS 设置为预期同时运行 DHCP 的最大接口数。 请注意,NX_DHCP_CLIENT_MAX_RECORDS 不必等于 NX_MAX_PHYSICAL_INTERFACES。 例如,NX_MAX_PHYSICAL_INTERFACES 可以为 3,而 NX_DHCP_CLIENT_MAX_RECORDS 等于 2。 使用此配置时,三个物理接口在任何时刻都只能有两个接口(并且在任何时候都可以是三个物理接口中的任意两个接口)可以运行 DHCP。 DHCP 客户端记录与网络接口之间没有一对一的映射,例如,客户端记录 1 不会自动与物理接口索引 1 关联。

NX_DHCP_CLIENT_MAX_RECORDS 也可以设置为大于 NX_MAX_PHYSICAL_INTERFACES,但这样会创建未使用的客户端记录,导致使用内存的效率低下。

应用程序必须通过调用 nx_dhcp_interface_enable 来启用任何接口,然后才能在这些接口上启动 DHCP。 请注意,在 nx_dhcp_create 调用中自动启用的主接口除外(可以使用下面讨论的 nx_dhcp_interface_disable 服务禁用该接口)。

在任何时候,接口都可以禁用 DHCP,或者在该接口上独立于其他运行 DHCP 的接口停止 DHCP。

如上所述,若要让特定接口启用 DHCP,请使用 nx_dhcp_interface_enable 服务,并在输入参数中指定物理接口索引。 最多可以启用 NX_DHCP_CLIENT_MAX_RECORDS 个接口,唯一的限制是接口索引输入参数必须小于 NX_MAX_PHYSICAL_INTERFACES。

若要在特定接口上启动 DHCP,请使用 nx_dhcp_interface_start 服务。 若要在所有已启用的接口上启动 DHCP,请使用 nx_dhcp_start 服务。 (已启动 DHCP 的接口不受 nx_dhcp_start 影响。)

若要在某一接口上停止 DHCP,请使用 nx_dhcp_interface_stop 服务。 DHCP 必须已在该接口上启动,否则会返回错误状态。 若要在所有已启用的接口上停止 DHCP,请使用 nx_dhcp_stop 服务。 DHCP 随时可以独立于其他接口停止。

大部分现有 DHCP 客户端服务都有“接口”等效项,例如,nx_dhcp_interface_release 是 nx_dhcp_release 的接口特定等效项。如果为单个接口配置 DHCP 客户端,则它们会执行相同的操作。

请注意,非接口特定 DHCP 客户端服务通常会应用于所有接口,但并非全都如此。 在后一种情况中,非接口特定服务会应用于搜索 DHCP 客户端接口记录列表时,系统找到的第一个已启用 DHCP 的接口。 如需了解多个接口启用 DHCP 时非接口特定服务的执行方式,请参阅第三章中的“服务说明”。

在以下示例序列中,IP 实例有两个网络接口,并且最初在辅助接口上运行 DHCP。 稍后,在主接口上启动 DHCP。 然后,释放主接口上的 IP 地址,并在主接口上重新启动 DHCP:

nx_dhcp_create(&my_dhcp_client); /* By default this enables primary interface for DHCP. */

nx_dhcp_interface_enable(&my_dhcp_client, 1); /* Secondary interface is enabled. */

nx_dhcp_interface_start(&my_dhcp_client, 1); /* DHCP is started on secondary interface. */

/* Some time later… */

nx_dhcp_interface_start(&my_dhcp_client, 0); /* DHCP is started on primary interface. */

nx_dhcp_interface_release(&my_dhcp_client, 0); /* Some time later… */

nx_dhcp_interface_start(&my_dhcp_client, 0); /* DHCP is restarted on primary interface. */

如需接口特定服务的完整列表,请参阅第三章中的“服务说明”。

配置选项

nxd_dhcp_client.h 中的用户可配置 DHCP 选项允许主机应用程序根据其特定需求微调 DHCP 客户端。 这些参数的列表如下所示:

  • NX_DHCP_ENABLE_BOOTP:定义后,此选项会启用 BOOTP 协议以代替 DHCP。 默认已禁用此选项。
  • NX_DHCP_CLIENT_RESTORE_STATE:定义后,此选项允许 DHCP 客户端保存其当前的 DHCP 客户端许可证“状态”,包括租约剩余时间,并在 DHCP 客户端应用程序重启之间还原该状态。 默认值为“已禁用”。
  • NX_DHCP_CLIENT_USER_CREATE_PACKET_POOL:设置此选项后,DHCP 客户端不会创建自己的数据包池。 主机应用程序必须使用 nx_dhcp_packet_pool_set 服务来设置 DHCP 客户端数据包池。 默认值为“已禁用”。
  • NX_DHCP_CLIENT_SEND_ARP_PROBE:定义后,此选项允许 DHCP 客户端在 IP 地址分配后发送 ARP 探测,以确认所分配的 DHCP 地址不是由另一主机所拥有。 默认情况下禁用此选项。
  • NX_DHCP_ARP_PROBE_WAIT:定义 DHCP 客户端在发送 ARP 探测后等待响应的时间长度。 默认值为 1 秒 (1 * NX_IP_PERIODIC_RATE)
  • NX_DHCP_ARP_PROBE_MIN:定义发送 ARP 探测之间的时间间隔最小偏差。 此值默认为 1 秒。
  • NX_DHCP_ARP_PROBE_MAX:定义发送 ARP 探测之间的时间间隔最大偏差。 此值默认为 2 秒。
  • NX_DHCP_ARP_PROBE_NUM:定义为了确定 DHCP 服务器所分配的 IP 地址是否已被使用而发送的 ARP 探测数。 此值默认为 3 个探测。
  • NX_DHCP_RESTART_WAIT:定义分配给 DHCP 客户端的 IP 地址已被使用时,DHCP 客户端等待重新启动 DHCP 的时间长度。 此值默认为 10 秒。
  • NX_DHCP_CLIENT_MAX_RECORDS:指定要保存到 DHCP 客户端实例的最大接口记录数。 DHCP 客户端接口记录是在特定接口上运行的 DHCP 客户端的记录。 默认值设置为物理接口计数 (NX_MAX_PHYSICAL_INTERFACES)。
  • NX_DHCP_CLIENT_SEND_MAX_DHCP_MESSAGE_OPTION:定义后,此选项允许 DHCP 客户端发送最大 DHCP 消息大小选项。 默认情况下禁用此选项。
  • NX_DHCP_CLIENT_ENABLE_HOST_NAME_CHECK:定义后,此选项允许 DHCP 客户端检查 nx_dhcp_create 调用中的输入主机名是否包含无效字符或者长度是否无效。 默认情况下禁用此选项。
  • NX_DHCP_THREAD_PRIORITY:DHCP 线程的优先级。 默认情况下,此值指定 DHCP 线程以优先级 3 运行。
  • NX_DHCP_THREAD_STACK_SIZE:DHCP 线程堆栈的大小。 默认情况下,大小为 2048 个字节。
  • NX_DHCP_TIME_INTERVAL:执行 DHCP 客户端计时器到期函数的时间间隔(以秒为单位)。 此函数会更新 DHCP 进程中的所有超时,例如,如果应重新传输消息或者 DHCP 客户端状态已更改。 默认情况下,此值为 1 秒。
  • NX_DHCP_OPTIONS_BUFFER_SIZE:DHCP 选项缓冲区的大小。 默认情况下,此值为 312 个字节。
  • NX_DHCP_PACKET_PAYLOAD:指定 DHCP 客户端数据包有效负载的大小(以字节为单位)。 默认值为 NX_DHCP_MINIMUM_IP_DATAGRAM + 物理标头大小。 有线网络中的物理标头大小通常为以太网帧大小。
  • NX_DHCP_PACKET_POOL_SIZE:指定 DHCP 客户端数据包池的大小。 默认值为 (5 *NX_DHCP_PACKET_PAYLOAD),这将提供四个数据包的空间,外加内部数据包池开销空间。
  • NX_DHCP_MIN_RETRANS_TIMEOUT:指定在重新传输客户端消息之前,接收 DHCP 服务器对该消息的回复的最小等待时间选项。 默认值为 RFC 2131 所建议的 4 秒。
  • NX_DHCP_MAX_RETRANS_TIMEOUT:指定在重新传输客户端消息之前,接收 DHCP 服务器对该消息的回复的最大等待时间选项。 默认值为 64 秒。
  • NX_DHCP_MIN_RENEW_TIMEOUT:指定在将 DHCP 客户端与某一 IP 地址绑定之后,接收 DHCP 服务器消息和发送续订请求的最小等待时间选项。 默认值为 60 秒。 但是,在默认为最小续订超时值之前,DHCP 客户端会使用来自 DHCP 服务器消息的续订和重新绑定到期时间。
  • NX_DHCP_TYPE_OF_SERVICE:DHCP UDP 请求所需的服务类型。 默认情况下,此值定义为 NX_IP_NORMAL,表示正常的 IP 数据包服务。
  • NX_DHCP_FRAGMENT_OPTION:为 DHCP UDP 请求启用分段。 默认情况下,此值为 NX_DONT_FRAGMENT,表示禁用 DHCP UDP 分段。
  • NX_DHCP_TIME_TO_LIVE:指定数据包在被丢弃之前可通过的路由器数目。 默认值设置为 0x80。
  • NX_DHCP_QUEUE_DEPTH:指定接收队列的最大深度数值。 默认值设置为 4。