Improve timeout backoff. It's a capped linear backoff. RFC specifies
capped randomized exponential, but I don't feel like incurring the cost when the cap is so low. Add comments for the dhcpMessage structure members.
This commit is contained in:
parent
18e6f8d2c6
commit
de23d2241d
@ -1,5 +1,5 @@
|
|||||||
/* options.c - DHCP options handling
|
/* options.c - DHCP options handling
|
||||||
* Time-stamp: <2011-03-30 16:41:03 nk>
|
* Time-stamp: <2011-03-30 18:29:18 nk>
|
||||||
*
|
*
|
||||||
* (c) 2004-2011 Nicholas J. Kain <njkain at gmail dot com>
|
* (c) 2004-2011 Nicholas J. Kain <njkain at gmail dot com>
|
||||||
*
|
*
|
||||||
|
@ -7,20 +7,23 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
struct dhcpMessage {
|
struct dhcpMessage {
|
||||||
uint8_t op;
|
uint8_t op; // Message type: 1 = BOOTREQUEST for clients.
|
||||||
uint8_t htype;
|
uint8_t htype; // ARP HW address type: always '1' for 10MB ethernet.
|
||||||
uint8_t hlen;
|
uint8_t hlen; // Hardware address length: always '6' for 10MB ethernet.
|
||||||
uint8_t hops;
|
uint8_t hops; // Client sets to zero.
|
||||||
uint32_t xid;
|
uint32_t xid; // Transaction ID: random number identifying session
|
||||||
uint16_t secs;
|
uint16_t secs; // Filled by client: seconds since client began address
|
||||||
uint16_t flags;
|
// aquisition or renewal process.
|
||||||
uint32_t ciaddr;
|
uint16_t flags; // DHCP flags
|
||||||
uint32_t yiaddr;
|
uint32_t ciaddr; // Client IP: only filled in if client is inBOUND, RENEW,
|
||||||
uint32_t siaddr;
|
// or REBINDING and can reply to ARP requests
|
||||||
uint32_t giaddr;
|
uint32_t yiaddr; // 'your' (client) IP address
|
||||||
uint8_t chaddr[16];
|
uint32_t siaddr; // IP address of next server to use in bootstrap; returned
|
||||||
uint8_t sname[64];
|
// in DHCPOFFER or DHCPACK by server
|
||||||
uint8_t file[128];
|
uint32_t giaddr; // relay agent IP: used when booting via relay agent
|
||||||
|
uint8_t chaddr[16]; // Client MAC address
|
||||||
|
uint8_t sname[64]; // Server host name (optional); null-terminated string
|
||||||
|
uint8_t file[128]; // boot file name, null-terminated string
|
||||||
uint32_t cookie;
|
uint32_t cookie;
|
||||||
uint8_t options[308]; /* 312 - cookie */
|
uint8_t options[308]; /* 312 - cookie */
|
||||||
};
|
};
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
#include "arp.h"
|
#include "arp.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define DELAY_SEC (((RETRY_DELAY - (RETRY_DELAY / NUMPACKETS)) / NUMPACKETS) + 1)
|
||||||
static void init_selecting_timeout(struct client_state_t *cs)
|
static void init_selecting_timeout(struct client_state_t *cs)
|
||||||
{
|
{
|
||||||
if (cs->packetNum < NUMPACKETS) {
|
if (cs->packetNum < NUMPACKETS) {
|
||||||
@ -17,7 +19,7 @@ static void init_selecting_timeout(struct client_state_t *cs)
|
|||||||
/* broadcast */
|
/* broadcast */
|
||||||
send_discover(cs->xid, cs->requestedIP);
|
send_discover(cs->xid, cs->requestedIP);
|
||||||
|
|
||||||
cs->timeout = ((cs->packetNum == NUMPACKETS - 1) ? 4 : 2) * 1000;
|
cs->timeout = DELAY_SEC * (cs->packetNum + 1);
|
||||||
cs->packetNum++;
|
cs->packetNum++;
|
||||||
} else {
|
} else {
|
||||||
if (client_config.background_if_no_lease) {
|
if (client_config.background_if_no_lease) {
|
||||||
@ -32,6 +34,7 @@ static void init_selecting_timeout(struct client_state_t *cs)
|
|||||||
cs->timeout = RETRY_DELAY * 1000;
|
cs->timeout = RETRY_DELAY * 1000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#undef DELAY_SEC
|
||||||
|
|
||||||
static void renew_requested_timeout(struct client_state_t *cs)
|
static void renew_requested_timeout(struct client_state_t *cs)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user