IOV_MESSAGE,
IOV_SERVERID,
IOV_NETMASK,
+ IOV_ROUTER,
+ IOV_ROUTER_ADDR,
+ IOV_DNSSERVER,
+ IOV_DNSSERVER_ADDR,
IOV_HOSTNAME,
IOV_HOSTNAME_NAME,
IOV_MTU,
.code = DHCPV4_OPT_NETMASK,
.len = sizeof(uint32_t),
};
+ struct dhcpv4_option reply_router = {
+ .code = DHCPV4_OPT_ROUTER,
+ };
+ struct dhcpv4_option reply_dnsserver = {
+ .code = DHCPV4_OPT_DNSSERVER,
+ };
struct dhcpv4_option reply_hostname = {
.code = DHCPV4_OPT_HOSTNAME,
};
[IOV_MESSAGE] = { &reply_msg, sizeof(reply_msg) },
[IOV_SERVERID] = { &reply_serverid, sizeof(reply_serverid) },
[IOV_NETMASK] = { &reply_netmask, 0 },
+ [IOV_ROUTER] = { &reply_router, 0 },
+ [IOV_ROUTER_ADDR] = { NULL, 0 },
+ [IOV_DNSSERVER] = { &reply_dnsserver, 0 },
+ [IOV_DNSSERVER_ADDR] = { NULL, 0 },
[IOV_HOSTNAME] = { &reply_hostname, 0 },
[IOV_HOSTNAME_NAME] = { NULL, 0 },
[IOV_MTU] = { &reply_mtu, 0 },
reply_opts = alloca(req_opts_len + 32);
reply_opts[reply_opts_len++] = DHCPV4_OPT_NETMASK;
+ reply_opts[reply_opts_len++] = DHCPV4_OPT_ROUTER;
+ reply_opts[reply_opts_len++] = DHCPV4_OPT_DNSSERVER;
reply_opts[reply_opts_len++] = DHCPV4_OPT_HOSTNAME;
reply_opts[reply_opts_len++] = DHCPV4_OPT_MTU;
reply_opts[reply_opts_len++] = DHCPV4_OPT_BROADCAST;
}
}
- if (iface->dhcpv4_router_cnt == 0)
- dhcpv4_put(&reply, &cursor, DHCPV4_OPT_ROUTER, 4, &iface->dhcpv4_local);
- else
- dhcpv4_put(&reply, &cursor, DHCPV4_OPT_ROUTER,
- 4 * iface->dhcpv4_router_cnt, iface->dhcpv4_router);
- reply_opts[reply_opts_len++] = DHCPV4_OPT_ROUTER;
-
- if (iface->dhcpv4_dns_cnt == 0) {
- if (iface->dns_service)
- dhcpv4_put(&reply, &cursor, DHCPV4_OPT_DNSSERVER, 4, &iface->dhcpv4_local);
- } else
- dhcpv4_put(&reply, &cursor, DHCPV4_OPT_DNSSERVER,
- 4 * iface->dhcpv4_dns_cnt, iface->dhcpv4_dns);
- reply_opts[reply_opts_len++] = DHCPV4_OPT_DNSSERVER;
-
memcpy(&reply_opts[reply_opts_len], req_opts, req_opts_len);
reply_opts_len += req_opts_len;
iov[IOV_NETMASK].iov_len = sizeof(reply_netmask);
break;
+ case DHCPV4_OPT_ROUTER:
+ iov[IOV_ROUTER].iov_len = sizeof(reply_router);
+ if (iface->dhcpv4_router_cnt) {
+ reply_router.len = iface->dhcpv4_router_cnt * sizeof(*iface->dhcpv4_router);
+ iov[IOV_ROUTER_ADDR].iov_base = iface->dhcpv4_router;
+ } else {
+ reply_router.len = sizeof(iface->dhcpv4_local);
+ iov[IOV_ROUTER_ADDR].iov_base = &iface->dhcpv4_local;
+ }
+ iov[IOV_ROUTER_ADDR].iov_len = reply_router.len;
+ break;
+
+ case DHCPV4_OPT_DNSSERVER:
+ iov[IOV_DNSSERVER].iov_len = sizeof(reply_dnsserver);
+ if (iface->dhcpv4_dns_cnt) {
+ reply_dnsserver.len = iface->dhcpv4_dns_cnt * sizeof(*iface->dhcpv4_dns);
+ iov[IOV_DNSSERVER_ADDR].iov_base = iface->dhcpv4_dns;
+ } else {
+ reply_dnsserver.len = sizeof(iface->dhcpv4_local);
+ iov[IOV_DNSSERVER_ADDR].iov_base = &iface->dhcpv4_local;
+ }
+ iov[IOV_DNSSERVER_ADDR].iov_len = reply_dnsserver.len;
+ break;
+
case DHCPV4_OPT_HOSTNAME:
if (!a || !a->hostname)
break;