Make ndhc use the new 'ip4' ifchd command.
This commit is contained in:
parent
c4f09b1a9a
commit
06ff60bb6b
@ -141,13 +141,11 @@ static int ifchd_cmd(char *buf, size_t buflen, uint8_t *optdata,
|
|||||||
int (*dofn)(char *, size_t, char *, uint8_t *, ssize_t);
|
int (*dofn)(char *, size_t, char *, uint8_t *, ssize_t);
|
||||||
char *optname;
|
char *optname;
|
||||||
switch (code) {
|
switch (code) {
|
||||||
IFCHD_SW_CMD(SUBNET, ip);
|
|
||||||
IFCHD_SW_CMD(DNS, iplist);
|
IFCHD_SW_CMD(DNS, iplist);
|
||||||
IFCHD_SW_CMD(LPRSVR, iplist);
|
IFCHD_SW_CMD(LPRSVR, iplist);
|
||||||
IFCHD_SW_CMD(NTPSVR, iplist);
|
IFCHD_SW_CMD(NTPSVR, iplist);
|
||||||
IFCHD_SW_CMD(WINS, iplist);
|
IFCHD_SW_CMD(WINS, iplist);
|
||||||
IFCHD_SW_CMD(ROUTER, ip);
|
IFCHD_SW_CMD(ROUTER, ip);
|
||||||
IFCHD_SW_CMD(BROADCAST, ip);
|
|
||||||
IFCHD_SW_CMD(TIMEZONE, s32);
|
IFCHD_SW_CMD(TIMEZONE, s32);
|
||||||
IFCHD_SW_CMD(HOSTNAME, str);
|
IFCHD_SW_CMD(HOSTNAME, str);
|
||||||
IFCHD_SW_CMD(DOMAIN, str);
|
IFCHD_SW_CMD(DOMAIN, str);
|
||||||
@ -208,13 +206,58 @@ void ifchange_deconfig(void)
|
|||||||
|
|
||||||
static size_t send_client_ip(char *out, size_t olen, struct dhcpmsg *packet)
|
static size_t send_client_ip(char *out, size_t olen, struct dhcpmsg *packet)
|
||||||
{
|
{
|
||||||
char ip[32], ipb[64];
|
static char snClassC[] = "255.255.255.0";
|
||||||
if (!memcmp(&packet->yiaddr, &cfg_packet.yiaddr, sizeof packet->yiaddr))
|
uint8_t optdata[MAX_DOPT_SIZE], olddata[MAX_DOPT_SIZE];
|
||||||
return 0;
|
char ipb[4*INET_ADDRSTRLEN], ip[INET_ADDRSTRLEN], sn[INET_ADDRSTRLEN],
|
||||||
|
bc[INET_ADDRSTRLEN];
|
||||||
|
ssize_t optlen, oldlen;
|
||||||
|
bool change_ipaddr = false;
|
||||||
|
bool have_subnet = false;
|
||||||
|
bool change_subnet = false;
|
||||||
|
bool have_bcast = false;
|
||||||
|
bool change_bcast = false;
|
||||||
|
|
||||||
|
if (memcmp(&packet->yiaddr, &cfg_packet.yiaddr, sizeof packet->yiaddr))
|
||||||
|
change_ipaddr = true;
|
||||||
inet_ntop(AF_INET, &packet->yiaddr, ip, sizeof ip);
|
inet_ntop(AF_INET, &packet->yiaddr, ip, sizeof ip);
|
||||||
snprintf(ipb, sizeof ipb, "ip:%s;", ip);
|
|
||||||
|
optlen = get_dhcp_opt(packet, DCODE_SUBNET, optdata, sizeof optdata);
|
||||||
|
if (optlen >= 4) {
|
||||||
|
have_subnet = true;
|
||||||
|
inet_ntop(AF_INET, optdata, sn, sizeof sn);
|
||||||
|
oldlen = get_dhcp_opt(&cfg_packet, DCODE_SUBNET, olddata,
|
||||||
|
sizeof olddata);
|
||||||
|
if (oldlen != optlen || memcmp(optdata, olddata, optlen))
|
||||||
|
change_subnet = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
optlen = get_dhcp_opt(packet, DCODE_BROADCAST, optdata, sizeof optdata);
|
||||||
|
if (optlen >= 4) {
|
||||||
|
have_bcast = true;
|
||||||
|
inet_ntop(AF_INET, optdata, bc, sizeof bc);
|
||||||
|
oldlen = get_dhcp_opt(&cfg_packet, DCODE_BROADCAST, olddata,
|
||||||
|
sizeof olddata);
|
||||||
|
if (oldlen != optlen || memcmp(optdata, olddata, optlen))
|
||||||
|
change_bcast = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nothing to change.
|
||||||
|
if (!change_ipaddr && !change_subnet && !change_bcast)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!have_subnet) {
|
||||||
|
log_line("Server did not send a subnet mask. Assuming class C (255.255.255.0).");
|
||||||
|
memcpy(sn, snClassC, sizeof snClassC);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (have_bcast) {
|
||||||
|
snprintf(ipb, sizeof ipb, "ip4:%s,%s,%s;", ip, sn, bc);
|
||||||
|
} else {
|
||||||
|
snprintf(ipb, sizeof ipb, "ip4:%s,%s;", ip, sn);
|
||||||
|
}
|
||||||
|
|
||||||
strnkcat(out, ipb, olen);
|
strnkcat(out, ipb, olen);
|
||||||
log_line("Sent to ifchd: %s", out);
|
log_line("Sent to ifchd: %s", ipb);
|
||||||
return strlen(ipb);
|
return strlen(ipb);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -253,13 +296,11 @@ void ifchange_bind(struct dhcpmsg *packet)
|
|||||||
|
|
||||||
snprintf(buf, sizeof buf, CMD_INTERFACE ":%s;", client_config.interface);
|
snprintf(buf, sizeof buf, CMD_INTERFACE ":%s;", client_config.interface);
|
||||||
tbs |= send_client_ip(buf, sizeof buf, packet);
|
tbs |= send_client_ip(buf, sizeof buf, packet);
|
||||||
tbs |= send_cmd(buf, sizeof buf, packet, DCODE_SUBNET);
|
|
||||||
tbs |= send_cmd(buf, sizeof buf, packet, DCODE_ROUTER);
|
tbs |= send_cmd(buf, sizeof buf, packet, DCODE_ROUTER);
|
||||||
tbs |= send_cmd(buf, sizeof buf, packet, DCODE_DNS);
|
tbs |= send_cmd(buf, sizeof buf, packet, DCODE_DNS);
|
||||||
tbs |= send_cmd(buf, sizeof buf, packet, DCODE_HOSTNAME);
|
tbs |= send_cmd(buf, sizeof buf, packet, DCODE_HOSTNAME);
|
||||||
tbs |= send_cmd(buf, sizeof buf, packet, DCODE_DOMAIN);
|
tbs |= send_cmd(buf, sizeof buf, packet, DCODE_DOMAIN);
|
||||||
tbs |= send_cmd(buf, sizeof buf, packet, DCODE_MTU);
|
tbs |= send_cmd(buf, sizeof buf, packet, DCODE_MTU);
|
||||||
tbs |= send_cmd(buf, sizeof buf, packet, DCODE_BROADCAST);
|
|
||||||
tbs |= send_cmd(buf, sizeof buf, packet, DCODE_WINS);
|
tbs |= send_cmd(buf, sizeof buf, packet, DCODE_WINS);
|
||||||
if (tbs) {
|
if (tbs) {
|
||||||
sockfd = open_ifch();
|
sockfd = open_ifch();
|
||||||
|
Loading…
Reference in New Issue
Block a user