* Copyright 2013 Kyungwan Han <asura321@gmail.com>
*
* Not in SUSv4.
-USE_DHCP(NEWTOY(dhcp, "V:H:F:x*r:O*A#<0T#<0t#<0s:p:i:SBRCaovqnbf", TOYFLAG_SBIN|TOYFLAG_ROOTONLY))
+USE_DHCP(NEWTOY(dhcp, "V:H:F:x*r:O*A#<0T#<0t#<0s:p:i:SBRCaovqnbfW", TOYFLAG_SBIN|TOYFLAG_ROOTONLY))
config DHCP
bool "dhcp"
-V VENDOR Vendor identifier (default 'toybox VERSION')
-C Don't send MAC as client identifier
-v Verbose
+ -W Workarround for buggy APs when DHCPDISCOVER/DHCPREQUEST set/unset BOOTP broadcast flag
Signals:
USR1 Renew current lease
static uint32_t xid;
static dhcpc_state_t *state;
static struct fd_pair sigfd;
+static int broadcast_flag;
uint8_t bmacaddr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
int set = 1;
uint8_t infomode = LOG_CONSOLE;
// Handle the message specific settings
switch (msgtype) {
case DHCPDISCOVER: // Broadcast DISCOVER message to all servers
- if (flag_chk(FLAG_B))
+ if (flag_chk(FLAG_B) || (flag_chk(FLAG_W) && broadcast_flag))
state->pdhcp.flags = htons(BOOTP_BROADCAST_ON); // Broadcast bit set.
else
state->pdhcp.flags = htons(BOOTP_BROADCAST_OFF); // Broadcast bit unset.
if (flag_chk(FLAG_x)) pend = set_xopt(pend);
break;
case DHCPREQUEST: // Send REQUEST message to the server that sent the *first* OFFER
- if (flag_chk(FLAG_B))
+ if (flag_chk(FLAG_B) || (flag_chk(FLAG_W) && broadcast_flag) || (server == INADDR_BROADCAST))
state->pdhcp.flags = htons(BOOTP_BROADCAST_ON); // Broadcast bit set.
else
state->pdhcp.flags = htons(BOOTP_BROADCAST_OFF); // Broadcast bit unset.
if (!packets) xid = getxid();
run_script(NULL, "deconfig");
infomsg(infomode, "Sending discover...");
+ broadcast_flag = (broadcast_flag + 1) % 2;
dhcpc_sendmsg(DHCPDISCOVER);
server = 0;
timeout = flag_get(FLAG_T, TT.timeout, 3);