version 1.1.1.4, 2021/03/17 00:56:46
|
version 1.1.1.5, 2023/09/27 11:02:07
|
Line 1
|
Line 1
|
/* dnsmasq is Copyright (c) 2000-2021 Simon Kelley | /* dnsmasq is Copyright (c) 2000-2022 Simon Kelley |
|
|
This program is free software; you can redistribute it and/or modify |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
it under the terms of the GNU General Public License as published by |
Line 372 size_t dhcp_reply(struct dhcp_context *context, char *
|
Line 372 size_t dhcp_reply(struct dhcp_context *context, char *
|
|
|
if (!context) |
if (!context) |
{ |
{ |
my_syslog(MS_DHCP | LOG_WARNING, _("no address range available for DHCP request %s %s"), | const char *via; |
subnet_addr.s_addr ? _("with subnet selector") : _("via"), | if (subnet_addr.s_addr) |
subnet_addr.s_addr ? inet_ntoa(subnet_addr) : (mess->giaddr.s_addr ? inet_ntoa(mess->giaddr) : iface_name)); | { |
| via = _("with subnet selector"); |
| inet_ntop(AF_INET, &subnet_addr, daemon->addrbuff, ADDRSTRLEN); |
| } |
| else |
| { |
| via = _("via"); |
| if (mess->giaddr.s_addr) |
| inet_ntop(AF_INET, &mess->giaddr, daemon->addrbuff, ADDRSTRLEN); |
| else |
| safe_strncpy(daemon->addrbuff, iface_name, ADDRSTRLEN); |
| } |
| my_syslog(MS_DHCP | LOG_WARNING, _("no address range available for DHCP request %s %s"), |
| via, daemon->addrbuff); |
return 0; |
return 0; |
} |
} |
|
|
Line 383 size_t dhcp_reply(struct dhcp_context *context, char *
|
Line 396 size_t dhcp_reply(struct dhcp_context *context, char *
|
struct dhcp_context *context_tmp; |
struct dhcp_context *context_tmp; |
for (context_tmp = context; context_tmp; context_tmp = context_tmp->current) |
for (context_tmp = context; context_tmp; context_tmp = context_tmp->current) |
{ |
{ |
strcpy(daemon->namebuff, inet_ntoa(context_tmp->start)); | inet_ntop(AF_INET, &context_tmp->start, daemon->namebuff, MAXDNAME); |
if (context_tmp->flags & (CONTEXT_STATIC | CONTEXT_PROXY)) |
if (context_tmp->flags & (CONTEXT_STATIC | CONTEXT_PROXY)) |
my_syslog(MS_DHCP | LOG_INFO, _("%u available DHCP subnet: %s/%s"), | { |
ntohl(mess->xid), daemon->namebuff, inet_ntoa(context_tmp->netmask)); | inet_ntop(AF_INET, &context_tmp->netmask, daemon->addrbuff, ADDRSTRLEN); |
| my_syslog(MS_DHCP | LOG_INFO, _("%u available DHCP subnet: %s/%s"), |
| ntohl(mess->xid), daemon->namebuff, daemon->addrbuff); |
| } |
else |
else |
my_syslog(MS_DHCP | LOG_INFO, _("%u available DHCP range: %s -- %s"), | { |
ntohl(mess->xid), daemon->namebuff, inet_ntoa(context_tmp->end)); | inet_ntop(AF_INET, &context_tmp->end, daemon->addrbuff, ADDRSTRLEN); |
| my_syslog(MS_DHCP | LOG_INFO, _("%u available DHCP range: %s -- %s"), |
| ntohl(mess->xid), daemon->namebuff, daemon->addrbuff); |
| } |
} |
} |
} |
} |
|
|
Line 1031 size_t dhcp_reply(struct dhcp_context *context, char *
|
Line 1050 size_t dhcp_reply(struct dhcp_context *context, char *
|
config->addr.s_addr == option_addr(opt).s_addr) |
config->addr.s_addr == option_addr(opt).s_addr) |
{ |
{ |
prettyprint_time(daemon->dhcp_buff, DECLINE_BACKOFF); |
prettyprint_time(daemon->dhcp_buff, DECLINE_BACKOFF); |
|
inet_ntop(AF_INET, &config->addr, daemon->addrbuff, ADDRSTRLEN); |
my_syslog(MS_DHCP | LOG_WARNING, _("disabling DHCP static address %s for %s"), |
my_syslog(MS_DHCP | LOG_WARNING, _("disabling DHCP static address %s for %s"), |
inet_ntoa(config->addr), daemon->dhcp_buff); | daemon->addrbuff, daemon->dhcp_buff); |
config->flags |= CONFIG_DECLINED; |
config->flags |= CONFIG_DECLINED; |
config->decline_time = now; |
config->decline_time = now; |
} |
} |
Line 1078 size_t dhcp_reply(struct dhcp_context *context, char *
|
Line 1098 size_t dhcp_reply(struct dhcp_context *context, char *
|
|
|
if (have_config(config, CONFIG_ADDR)) |
if (have_config(config, CONFIG_ADDR)) |
{ |
{ |
char *addrs = inet_ntoa(config->addr); | inet_ntop(AF_INET, &config->addr, daemon->addrbuff, ADDRSTRLEN); |
|
|
if ((ltmp = lease_find_by_addr(config->addr)) && |
if ((ltmp = lease_find_by_addr(config->addr)) && |
ltmp != lease && |
ltmp != lease && |
Line 1088 size_t dhcp_reply(struct dhcp_context *context, char *
|
Line 1108 size_t dhcp_reply(struct dhcp_context *context, char *
|
unsigned char *mac = extended_hwaddr(ltmp->hwaddr_type, ltmp->hwaddr_len, |
unsigned char *mac = extended_hwaddr(ltmp->hwaddr_type, ltmp->hwaddr_len, |
ltmp->hwaddr, ltmp->clid_len, ltmp->clid, &len); |
ltmp->hwaddr, ltmp->clid_len, ltmp->clid, &len); |
my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it is leased to %s"), |
my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it is leased to %s"), |
addrs, print_mac(daemon->namebuff, mac, len)); | daemon->addrbuff, print_mac(daemon->namebuff, mac, len)); |
} |
} |
else |
else |
{ |
{ |
Line 1097 size_t dhcp_reply(struct dhcp_context *context, char *
|
Line 1117 size_t dhcp_reply(struct dhcp_context *context, char *
|
if (context->router.s_addr == config->addr.s_addr) |
if (context->router.s_addr == config->addr.s_addr) |
break; |
break; |
if (tmp) |
if (tmp) |
my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it is in use by the server or relay"), addrs); | my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it is in use by the server or relay"), daemon->addrbuff); |
else if (have_config(config, CONFIG_DECLINED) && |
else if (have_config(config, CONFIG_DECLINED) && |
difftime(now, config->decline_time) < (float)DECLINE_BACKOFF) |
difftime(now, config->decline_time) < (float)DECLINE_BACKOFF) |
my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it was previously declined"), addrs); | my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it was previously declined"), daemon->addrbuff); |
else |
else |
conf = config->addr; |
conf = config->addr; |
} |
} |
Line 1133 size_t dhcp_reply(struct dhcp_context *context, char *
|
Line 1153 size_t dhcp_reply(struct dhcp_context *context, char *
|
tagif_netid = run_tag_if(&context->netid); |
tagif_netid = run_tag_if(&context->netid); |
} |
} |
|
|
log_tags(tagif_netid, ntohl(mess->xid)); |
|
apply_delay(mess->xid, recvtime, tagif_netid); |
apply_delay(mess->xid, recvtime, tagif_netid); |
|
|
if (option_bool(OPT_RAPID_COMMIT) && option_find(mess, sz, OPTION_RAPID_COMMIT, 0)) |
if (option_bool(OPT_RAPID_COMMIT) && option_find(mess, sz, OPTION_RAPID_COMMIT, 0)) |
{ |
{ |
rapid_commit = 1; |
rapid_commit = 1; |
|
/* If a lease exists for this host and another address, squash it. */ |
|
if (lease && lease->addr.s_addr != mess->yiaddr.s_addr) |
|
{ |
|
lease_prune(lease, now); |
|
lease = NULL; |
|
} |
goto rapid_commit; |
goto rapid_commit; |
} |
} |
|
|
|
log_tags(tagif_netid, ntohl(mess->xid)); |
|
|
daemon->metrics[METRIC_DHCPOFFER]++; |
daemon->metrics[METRIC_DHCPOFFER]++; |
log_packet("DHCPOFFER" , &mess->yiaddr, emac, emac_len, iface_name, NULL, NULL, mess->xid); |
log_packet("DHCPOFFER" , &mess->yiaddr, emac, emac_len, iface_name, NULL, NULL, mess->xid); |
|
|
Line 1303 size_t dhcp_reply(struct dhcp_context *context, char *
|
Line 1330 size_t dhcp_reply(struct dhcp_context *context, char *
|
a lease from one of it's MACs to give the address to another. */ |
a lease from one of it's MACs to give the address to another. */ |
if (config && config_has_mac(config, ltmp->hwaddr, ltmp->hwaddr_len, ltmp->hwaddr_type)) |
if (config && config_has_mac(config, ltmp->hwaddr, ltmp->hwaddr_len, ltmp->hwaddr_type)) |
{ |
{ |
|
inet_ntop(AF_INET, <mp->addr, daemon->addrbuff, ADDRSTRLEN); |
my_syslog(MS_DHCP | LOG_INFO, _("abandoning lease to %s of %s"), |
my_syslog(MS_DHCP | LOG_INFO, _("abandoning lease to %s of %s"), |
print_mac(daemon->namebuff, ltmp->hwaddr, ltmp->hwaddr_len), |
print_mac(daemon->namebuff, ltmp->hwaddr, ltmp->hwaddr_len), |
inet_ntoa(ltmp->addr)); | daemon->addrbuff); |
lease = ltmp; |
lease = ltmp; |
} |
} |
else |
else |
Line 1399 size_t dhcp_reply(struct dhcp_context *context, char *
|
Line 1427 size_t dhcp_reply(struct dhcp_context *context, char *
|
/* DNSMASQ_REQUESTED_OPTIONS */ |
/* DNSMASQ_REQUESTED_OPTIONS */ |
if ((opt = option_find(mess, sz, OPTION_REQUESTED_OPTIONS, 1))) |
if ((opt = option_find(mess, sz, OPTION_REQUESTED_OPTIONS, 1))) |
{ |
{ |
int len = option_len(opt); | int i, len = option_len(opt); |
unsigned char *rop = option_ptr(opt, 0); |
unsigned char *rop = option_ptr(opt, 0); |
char *q = daemon->namebuff; | |
int i; | |
for (i = 0; i < len; i++) |
for (i = 0; i < len; i++) |
{ | lease_add_extradata(lease, (unsigned char *)daemon->namebuff, |
q += snprintf(q, MAXDNAME - (q - daemon->namebuff), "%d%s", rop[i], i + 1 == len ? "" : ","); | sprintf(daemon->namebuff, "%u", rop[i]), (i + 1) == len ? 0 : ','); |
} | |
lease_add_extradata(lease, (unsigned char *)daemon->namebuff, (q - daemon->namebuff), 0); | |
} |
} |
else |
else |
{ | lease_add_extradata(lease, NULL, 0, 0); |
add_extradata_opt(lease, NULL); | |
} | add_extradata_opt(lease, option_find(mess, sz, OPTION_MUD_URL_V4, 1)); |
| |
/* space-concat tag set */ |
/* space-concat tag set */ |
if (!tagif_netid) |
if (!tagif_netid) |
add_extradata_opt(lease, NULL); |
add_extradata_opt(lease, NULL); |
Line 1653 static int sanitise(unsigned char *opt, char *buf)
|
Line 1678 static int sanitise(unsigned char *opt, char *buf)
|
for (i = option_len(opt); i > 0; i--) |
for (i = option_len(opt); i > 0; i--) |
{ |
{ |
char c = *p++; |
char c = *p++; |
if (isprint((int)c)) | if (isprint((unsigned char)c)) |
*buf++ = c; |
*buf++ = c; |
} |
} |
*buf = 0; /* add terminator */ |
*buf = 0; /* add terminator */ |
Line 1674 static void add_extradata_opt(struct dhcp_lease *lease
|
Line 1699 static void add_extradata_opt(struct dhcp_lease *lease
|
static void log_packet(char *type, void *addr, unsigned char *ext_mac, |
static void log_packet(char *type, void *addr, unsigned char *ext_mac, |
int mac_len, char *interface, char *string, char *err, u32 xid) |
int mac_len, char *interface, char *string, char *err, u32 xid) |
{ |
{ |
struct in_addr a; |
|
|
|
if (!err && !option_bool(OPT_LOG_OPTS) && option_bool(OPT_QUIET_DHCP)) |
if (!err && !option_bool(OPT_LOG_OPTS) && option_bool(OPT_QUIET_DHCP)) |
return; |
return; |
|
|
/* addr may be misaligned */ | daemon->addrbuff[0] = 0; |
if (addr) |
if (addr) |
memcpy(&a, addr, sizeof(a)); | inet_ntop(AF_INET, addr, daemon->addrbuff, ADDRSTRLEN); |
|
|
print_mac(daemon->namebuff, ext_mac, mac_len); |
print_mac(daemon->namebuff, ext_mac, mac_len); |
|
|
if(option_bool(OPT_LOG_OPTS)) | if (option_bool(OPT_LOG_OPTS)) |
my_syslog(MS_DHCP | LOG_INFO, "%u %s(%s) %s%s%s %s%s", | my_syslog(MS_DHCP | LOG_INFO, "%u %s(%s) %s%s%s %s%s", |
ntohl(xid), | ntohl(xid), |
type, | type, |
interface, | interface, |
addr ? inet_ntoa(a) : "", | daemon->addrbuff, |
addr ? " " : "", | addr ? " " : "", |
daemon->namebuff, | daemon->namebuff, |
string ? string : "", | string ? string : "", |
err ? err : ""); | err ? err : ""); |
else |
else |
my_syslog(MS_DHCP | LOG_INFO, "%s(%s) %s%s%s %s%s", |
my_syslog(MS_DHCP | LOG_INFO, "%s(%s) %s%s%s %s%s", |
type, |
type, |
interface, |
interface, |
addr ? inet_ntoa(a) : "", | daemon->addrbuff, |
addr ? " " : "", |
addr ? " " : "", |
daemon->namebuff, |
daemon->namebuff, |
string ? string : "", |
string ? string : "", |
err ? err : ""); |
err ? err : ""); |
| |
#ifdef HAVE_UBUS |
#ifdef HAVE_UBUS |
if (!strcmp(type, "DHCPACK")) | if (!strcmp(type, "DHCPACK")) |
ubus_event_bcast("dhcp.ack", daemon->namebuff, addr ? inet_ntoa(a) : NULL, string ? string : NULL, interface); | ubus_event_bcast("dhcp.ack", daemon->namebuff, addr ? daemon->addrbuff : NULL, string, interface); |
else if (!strcmp(type, "DHCPRELEASE")) | else if (!strcmp(type, "DHCPRELEASE")) |
ubus_event_bcast("dhcp.release", daemon->namebuff, addr ? inet_ntoa(a) : NULL, string ? string : NULL, interface); | ubus_event_bcast("dhcp.release", daemon->namebuff, addr ? daemon->addrbuff : NULL, string, interface); |
#endif |
#endif |
} |
} |
|
|
Line 1861 static size_t dhcp_packet_size(struct dhcp_packet *mes
|
Line 1884 static size_t dhcp_packet_size(struct dhcp_packet *mes
|
if (option_bool(OPT_LOG_OPTS)) |
if (option_bool(OPT_LOG_OPTS)) |
{ |
{ |
if (mess->siaddr.s_addr != 0) |
if (mess->siaddr.s_addr != 0) |
my_syslog(MS_DHCP | LOG_INFO, _("%u next server: %s"), ntohl(mess->xid), inet_ntoa(mess->siaddr)); | { |
| inet_ntop(AF_INET, &mess->siaddr, daemon->addrbuff, ADDRSTRLEN); |
| my_syslog(MS_DHCP | LOG_INFO, _("%u next server: %s"), ntohl(mess->xid), daemon->addrbuff); |
| } |
|
|
if ((mess->flags & htons(0x8000)) && mess->ciaddr.s_addr == 0) |
if ((mess->flags & htons(0x8000)) && mess->ciaddr.s_addr == 0) |
my_syslog(MS_DHCP | LOG_INFO, _("%u broadcast response"), ntohl(mess->xid)); |
my_syslog(MS_DHCP | LOG_INFO, _("%u broadcast response"), ntohl(mess->xid)); |
Line 2178 static int pxe_uefi_workaround(int pxe_arch, struct dh
|
Line 2204 static int pxe_uefi_workaround(int pxe_arch, struct dh
|
inet_ntop(AF_INET, &mess->siaddr, (char *)mess->sname, INET_ADDRSTRLEN); |
inet_ntop(AF_INET, &mess->siaddr, (char *)mess->sname, INET_ADDRSTRLEN); |
} |
} |
|
|
snprintf((char *)mess->file, sizeof(mess->file), | if (found->basename) |
strchr(found->basename, '.') ? "%s" : "%s.0", found->basename); | snprintf((char *)mess->file, sizeof(mess->file), |
| strchr(found->basename, '.') ? "%s" : "%s.0", found->basename); |
|
|
return 1; |
return 1; |
} |
} |
Line 2785 static void apply_delay(u32 xid, time_t recvtime, stru
|
Line 2812 static void apply_delay(u32 xid, time_t recvtime, stru
|
} |
} |
} |
} |
|
|
#endif | #endif /* HAVE_DHCP */ |
| |
| |
| |
| |
| |
| |
| |