uint32_t TransactionID;
char HWAddr[6];
-
+
+ int64_t StartTime;
int64_t Timeout;
int nTimeouts;
} tInterface;
return -1;
}
i->State = STATE_PREINIT;
+ i->StartTime = _SysTimestamp();
// Send request
Send_DHCPDISCOVER(i);
msg->siaddr = htonl(0); // siaddr - Zero? maybe -1
msg->giaddr = htonl(0); // giaddr - Zero?
memcpy(msg->chaddr, Iface->HWAddr, 6);
+ memset(msg->chaddr+6, 0, sizeof(msg->chaddr)-6);
memset(msg->sname, 0, sizeof(msg->sname)); // Nuke the rest
memset(msg->file, 0, sizeof(msg->file)); // Nuke the rest
int i;
msg = (void*) ((char*)OfferPacket) + 8;
+ if( msg->xid != Iface->TransactionID ) {
+ return ;
+ }
+
// Reuses old data :)
- msg->op = 1;
- msg->htype = 1;
- msg->hlen = 6;
- msg->hops = 0;
- msg->xid = msg->xid;
- msg->secs = htons(0); // TODO: Maintain times
- msg->flags = htons(0);
+ msg->op = htonb(1);
+ msg->htype = htonb(1);
+ msg->hlen = htonb(6);
+ msg->hops = htonb(0);
+ msg->xid = htonl(Iface->TransactionID);
+ msg->secs = htons( (_SysTimestamp()-Iface->StartTime+499)/1000 ); // TODO: Maintain times
+ msg->flags = htons(0x0000);
memcpy(msg->chaddr, Iface->HWAddr, 6);
memset(msg->sname, 0, sizeof(msg->sname)); // Nuke the rest
memset(msg->file, 0, sizeof(msg->file)); // Nuke the rest
void *router = NULL;
void *subnet_mask = NULL;
- _SysDebug("Doing read on %i", Iface->SocketFD);
+ _SysDebug("Doing read on %s %i", Iface->Adapter, Iface->SocketFD);
len = _SysRead(Iface->SocketFD, data, sizeof(data));
_SysDebug("len = %i", len);
switch(Iface->State)
{
case STATE_DISCOVER_SENT:
+ fprintf(stderr, "DHCPDISCOVER timeout on %s, trying again\n", Iface->Adapter);
Send_DHCPDISCOVER(Iface);
break;
+ case STATE_REQUEST_SENT:
+ fprintf(stderr, "DHCPREQUEST timeout on %s\n", Iface->Adapter);
+ return 1;
default:
- _SysDebug("Timeout with state = %i", Iface->State);
- break;
+ _SysDebug("Timeout with state = %i (%s)", Iface->State, Iface->Adapter);
+ return 1;
}
return 0;
}