/** * Network manager creates DHCPACK */ int NetworkManager::ack(const Client& client, uint32_t u32Xid, uint8_t *pu8ReqList, int cReqList) { RTNETADDRIPV4 address; prepareReplyPacket4Client(client, u32Xid); Lease l = client.lease(); address = l.getAddress(); m->BootPReplyMsg.BootPHeader.bp_ciaddr = address; /* rfc2131 4.3.1 is about DHCPDISCOVER and this value is equal to ciaddr from * DHCPREQUEST or 0 ... * XXX: Using addressHint is not correct way to initialize [cy]iaddress... */ m->BootPReplyMsg.BootPHeader.bp_ciaddr = address; m->BootPReplyMsg.BootPHeader.bp_yiaddr = address; Assert(m->BootPReplyMsg.BootPHeader.bp_yiaddr.u); /* options: * - IP address lease time (if DHCPREQUEST) * - message type * - server identifier */ RawOption opt; RT_ZERO(opt); std::vector<RawOption> extra; opt.u8OptId = RTNET_DHCP_OPT_MSG_TYPE; opt.au8RawOpt[0] = RTNET_DHCP_MT_ACK; opt.cbRawOpt = 1; extra.push_back(opt); /* * XXX: lease time should be conditional. If on dhcprequest then tim should be provided, * else on dhcpinform it mustn't. */ opt.u8OptId = RTNET_DHCP_OPT_LEASE_TIME; *(uint32_t *)opt.au8RawOpt = RT_H2N_U32(l.getExpiration()); opt.cbRawOpt = sizeof(RTNETADDRIPV4); extra.push_back(opt); processParameterReqList(client, pu8ReqList, cReqList, extra); return doReply(client, extra); }