diff options
-rw-r--r-- | CHANGELOG | 9 | ||||
-rw-r--r-- | man/dnsmasq.8 | 3 | ||||
-rw-r--r-- | src/helper.c | 8 | ||||
-rw-r--r-- | src/rfc2131.c | 15 |
4 files changed, 32 insertions, 3 deletions
@@ -30,7 +30,14 @@ version 2.66 Don't send the default DHCP option advertising dnsmasq as the local DNS server if dnsmasq is configured to not act as DNS server, or it's configured to a non-standard port. - + + Add DNSMASQ_CIRCUIT_ID, DNSMASQ_SUBCRIBER_ID, + DNSMASQ_REMOTE_ID variables to the environment of the + lease-change script (and the correponding Lua). These hold + information inserted into the DHCP request by a DHCP relay + agent. Thanks to Lakefield Communications for providing a + bounty for this addition. + version 2.65 Fix regression which broke forwarding of queries sent via diff --git a/man/dnsmasq.8 b/man/dnsmasq.8 index b8dcfc7..aff2c4d 100644 --- a/man/dnsmasq.8 +++ b/man/dnsmasq.8 @@ -1230,6 +1230,9 @@ For IPv4 only: DNSMASQ_CLIENT_ID if the host provided a client-id. +DNSMASQ_CIRCUIT_ID, DNSMASQ_SUBSCRIBER_ID, DNSMASQ_REMOTE_ID if a +DHCP relay-agent added any of these options. + If the client provides vendor-class, DNSMASQ_VENDOR_CLASS. For IPv6 only: diff --git a/src/helper.c b/src/helper.c index 609e086..0651741 100644 --- a/src/helper.c +++ b/src/helper.c @@ -397,6 +397,9 @@ int create_helper(int event_fd, int err_fd, uid_t uid, gid_t gid, long max_fd) buf = grab_extradata_lua(buf, end, "cpewan_oui"); buf = grab_extradata_lua(buf, end, "cpewan_serial"); buf = grab_extradata_lua(buf, end, "cpewan_class"); + buf = grab_extradata_lua(buf, end, "circuit_id"); + buf = grab_extradata_lua(buf, end, "subscriber_id"); + buf = grab_extradata_lua(buf, end, "remote_id"); } buf = grab_extradata_lua(buf, end, "tags"); @@ -528,10 +531,13 @@ int create_helper(int event_fd, int err_fd, uid_t uid, gid_t gid, long max_fd) buf = grab_extradata(buf, end, "DNSMASQ_CPEWAN_OUI", &err); buf = grab_extradata(buf, end, "DNSMASQ_CPEWAN_SERIAL", &err); buf = grab_extradata(buf, end, "DNSMASQ_CPEWAN_CLASS", &err); + buf = grab_extradata(buf, end, "DNSMASQ_CIRCUIT_ID", &err); + buf = grab_extradata(buf, end, "DNSMASQ_SUBSCRIBER_ID", &err); + buf = grab_extradata(buf, end, "DNSMASQ_REMOTE_ID", &err); } buf = grab_extradata(buf, end, "DNSMASQ_TAGS", &err); - + if (is6) buf = grab_extradata(buf, end, "DNSMASQ_RELAY_ADDRESS", &err); else if (data.giaddr.s_addr != 0) diff --git a/src/rfc2131.c b/src/rfc2131.c index fcb8dc5..92974c0 100644 --- a/src/rfc2131.c +++ b/src/rfc2131.c @@ -1256,7 +1256,20 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index, add_extradata_opt(lease, oui); add_extradata_opt(lease, serial); add_extradata_opt(lease, class); - + + if ((opt = option_find(mess, sz, OPTION_AGENT_ID, 1))) + { + add_extradata_opt(lease, option_find1(option_ptr(opt, 0), option_ptr(opt, option_len(opt)), SUBOPT_CIRCUIT_ID, 1)); + add_extradata_opt(lease, option_find1(option_ptr(opt, 0), option_ptr(opt, option_len(opt)), SUBOPT_SUBSCR_ID, 1)); + add_extradata_opt(lease, option_find1(option_ptr(opt, 0), option_ptr(opt, option_len(opt)), SUBOPT_REMOTE_ID, 1)); + } + else + { + add_extradata_opt(lease, NULL); + add_extradata_opt(lease, NULL); + add_extradata_opt(lease, NULL); + } + /* space-concat tag set */ if (!tagif_netid) add_extradata_opt(lease, NULL); |