Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
D
Dnsmasq
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nanahira
Dnsmasq
Commits
734d5317
Commit
734d5317
authored
Mar 23, 2018
by
Simon Kelley
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add RFC4039 rapid commit support.
parent
9a7be476
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
49 additions
and
8 deletions
+49
-8
CHANGELOG
CHANGELOG
+5
-0
dnsmasq.conf.example
dnsmasq.conf.example
+8
-0
man/dnsmasq.8
man/dnsmasq.8
+7
-0
src/dhcp-common.c
src/dhcp-common.c
+1
-0
src/dhcp-protocol.h
src/dhcp-protocol.h
+1
-0
src/dnsmasq.h
src/dnsmasq.h
+2
-1
src/option.c
src/option.c
+3
-0
src/rfc2131.c
src/rfc2131.c
+22
-7
No files found.
CHANGELOG
View file @
734d5317
version 2.80
Add support for RFC 4039 DHCP rapid commit. Thanks to Ashram Method
for the initial patch and motivation.
version 2.79
version 2.79
Fix parsing of CNAME arguments, which are confused by extra spaces.
Fix parsing of CNAME arguments, which are confused by extra spaces.
Thanks to Diego Aguirre for spotting the bug.
Thanks to Diego Aguirre for spotting the bug.
...
...
dnsmasq.conf.example
View file @
734d5317
...
@@ -547,6 +547,14 @@
...
@@ -547,6 +547,14 @@
# http://www.isc.org/files/auth.html
# http://www.isc.org/files/auth.html
#dhcp-authoritative
#dhcp-authoritative
# Set the DHCP server to enable DHCPv4 Rapid Commit Option per RFC 4039.
# In this mode it will respond to a DHCPDISCOVER message including a Rapid Commit
# option with a DHCPACK including a Rapid Commit option and fully committed address
# and configuration information. This must only be enabled if either the server is
# the only server for the subnet, or multiple servers are present and they each
# commit a binding for all clients.
#dhcp-rapid-commit
# Run an executable when a DHCP lease is created or destroyed.
# Run an executable when a DHCP lease is created or destroyed.
# The arguments sent to the script are "add" or "del",
# The arguments sent to the script are "add" or "del",
# then the MAC address, the IP address and finally the hostname
# then the MAC address, the IP address and finally the hostname
...
...
man/dnsmasq.8
View file @
734d5317
...
@@ -1452,6 +1452,13 @@ allows dnsmasq to rebuild its lease database without each client needing to
...
@@ -1452,6 +1452,13 @@ allows dnsmasq to rebuild its lease database without each client needing to
reacquire a lease, if the database is lost. For DHCPv6 it sets the
reacquire a lease, if the database is lost. For DHCPv6 it sets the
priority in replies to 255 (the maximum) instead of 0 (the minimum).
priority in replies to 255 (the maximum) instead of 0 (the minimum).
.TP
.TP
.B --dhcp-rapid-commit
Enable DHCPv4 Rapid Commit Option specified in RFC 4039. When enabled, dnsmasq
will respond to a DHCPDISCOVER message including a Rapid Commit
option with a DHCPACK including a Rapid Commit option and fully committed
address and configuration information. Should only be enabled if either the
server is the only server for the subnet, or multiple servers are present and they each commit a binding for all clients.
.TP
.B --dhcp-alternate-port[=<server port>[,<client port>]]
.B --dhcp-alternate-port[=<server port>[,<client port>]]
(IPv4 only) Change the ports used for DHCP from the default. If this option is
(IPv4 only) Change the ports used for DHCP from the default. If this option is
given alone, without arguments, it changes the ports used for DHCP
given alone, without arguments, it changes the ports used for DHCP
...
...
src/dhcp-common.c
View file @
734d5317
...
@@ -556,6 +556,7 @@ static const struct opttab_t {
...
@@ -556,6 +556,7 @@ static const struct opttab_t {
{
"nntp-server"
,
71
,
OT_ADDR_LIST
},
{
"nntp-server"
,
71
,
OT_ADDR_LIST
},
{
"irc-server"
,
74
,
OT_ADDR_LIST
},
{
"irc-server"
,
74
,
OT_ADDR_LIST
},
{
"user-class"
,
77
,
0
},
{
"user-class"
,
77
,
0
},
{
"rapid-commit"
,
80
,
0
},
{
"FQDN"
,
81
,
OT_INTERNAL
},
{
"FQDN"
,
81
,
OT_INTERNAL
},
{
"agent-id"
,
82
,
OT_INTERNAL
},
{
"agent-id"
,
82
,
OT_INTERNAL
},
{
"client-arch"
,
93
,
2
|
OT_DEC
},
{
"client-arch"
,
93
,
2
|
OT_DEC
},
...
...
src/dhcp-protocol.h
View file @
734d5317
...
@@ -54,6 +54,7 @@
...
@@ -54,6 +54,7 @@
#define OPTION_SNAME 66
#define OPTION_SNAME 66
#define OPTION_FILENAME 67
#define OPTION_FILENAME 67
#define OPTION_USER_CLASS 77
#define OPTION_USER_CLASS 77
#define OPTION_RAPID_COMMIT 80
#define OPTION_CLIENT_FQDN 81
#define OPTION_CLIENT_FQDN 81
#define OPTION_AGENT_ID 82
#define OPTION_AGENT_ID 82
#define OPTION_ARCH 93
#define OPTION_ARCH 93
...
...
src/dnsmasq.h
View file @
734d5317
...
@@ -250,7 +250,8 @@ struct event_desc {
...
@@ -250,7 +250,8 @@ struct event_desc {
#define OPT_MAC_B64 54
#define OPT_MAC_B64 54
#define OPT_MAC_HEX 55
#define OPT_MAC_HEX 55
#define OPT_TFTP_APREF_MAC 56
#define OPT_TFTP_APREF_MAC 56
#define OPT_LAST 57
#define OPT_RAPID_COMMIT 57
#define OPT_LAST 58
/* extra flags for my_syslog, we use a couple of facilities since they are known
/* extra flags for my_syslog, we use a couple of facilities since they are known
not to occupy the same bits as priorities, no matter how syslog.h is set up. */
not to occupy the same bits as priorities, no matter how syslog.h is set up. */
...
...
src/option.c
View file @
734d5317
...
@@ -160,6 +160,7 @@ struct myoption {
...
@@ -160,6 +160,7 @@ struct myoption {
#define LOPT_DHCPTTL 348
#define LOPT_DHCPTTL 348
#define LOPT_TFTP_MTU 349
#define LOPT_TFTP_MTU 349
#define LOPT_REPLY_DELAY 350
#define LOPT_REPLY_DELAY 350
#define LOPT_RAPID_COMMIT 351
#ifdef HAVE_GETOPT_LONG
#ifdef HAVE_GETOPT_LONG
static
const
struct
option
opts
[]
=
static
const
struct
option
opts
[]
=
...
@@ -325,6 +326,7 @@ static const struct myoption opts[] =
...
@@ -325,6 +326,7 @@ static const struct myoption opts[] =
{
"script-arp"
,
0
,
0
,
LOPT_SCRIPT_ARP
},
{
"script-arp"
,
0
,
0
,
LOPT_SCRIPT_ARP
},
{
"dhcp-ttl"
,
1
,
0
,
LOPT_DHCPTTL
},
{
"dhcp-ttl"
,
1
,
0
,
LOPT_DHCPTTL
},
{
"dhcp-reply-delay"
,
1
,
0
,
LOPT_REPLY_DELAY
},
{
"dhcp-reply-delay"
,
1
,
0
,
LOPT_REPLY_DELAY
},
{
"dhcp-rapid-commit"
,
0
,
0
,
LOPT_RAPID_COMMIT
},
{
NULL
,
0
,
0
,
0
}
{
NULL
,
0
,
0
,
0
}
};
};
...
@@ -497,6 +499,7 @@ static struct {
...
@@ -497,6 +499,7 @@ static struct {
{
LOPT_IGNORE_ADDR
,
ARG_DUP
,
"<ipaddr>"
,
gettext_noop
(
"Ignore DNS responses containing ipaddr."
),
NULL
},
{
LOPT_IGNORE_ADDR
,
ARG_DUP
,
"<ipaddr>"
,
gettext_noop
(
"Ignore DNS responses containing ipaddr."
),
NULL
},
{
LOPT_DHCPTTL
,
ARG_ONE
,
"<ttl>"
,
gettext_noop
(
"Set TTL in DNS responses with DHCP-derived addresses."
),
NULL
},
{
LOPT_DHCPTTL
,
ARG_ONE
,
"<ttl>"
,
gettext_noop
(
"Set TTL in DNS responses with DHCP-derived addresses."
),
NULL
},
{
LOPT_REPLY_DELAY
,
ARG_ONE
,
"<integer>"
,
gettext_noop
(
"Delay DHCP replies for at least number of seconds."
),
NULL
},
{
LOPT_REPLY_DELAY
,
ARG_ONE
,
"<integer>"
,
gettext_noop
(
"Delay DHCP replies for at least number of seconds."
),
NULL
},
{
LOPT_RAPID_COMMIT
,
OPT_RAPID_COMMIT
,
NULL
,
gettext_noop
(
"Enables DHCPv4 Rapid Commit option."
),
NULL
},
{
0
,
0
,
NULL
,
NULL
,
NULL
}
{
0
,
0
,
NULL
,
NULL
,
NULL
}
};
};
...
...
src/rfc2131.c
View file @
734d5317
...
@@ -75,7 +75,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
...
@@ -75,7 +75,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
struct
dhcp_vendor
*
vendor
;
struct
dhcp_vendor
*
vendor
;
struct
dhcp_mac
*
mac
;
struct
dhcp_mac
*
mac
;
struct
dhcp_netid_list
*
id_list
;
struct
dhcp_netid_list
*
id_list
;
int
clid_len
=
0
,
ignore
=
0
,
do_classes
=
0
,
selecting
=
0
,
pxearch
=
-
1
;
int
clid_len
=
0
,
ignore
=
0
,
do_classes
=
0
,
rapid_commit
=
0
,
selecting
=
0
,
pxearch
=
-
1
;
struct
dhcp_packet
*
mess
=
(
struct
dhcp_packet
*
)
daemon
->
dhcp_packet
.
iov_base
;
struct
dhcp_packet
*
mess
=
(
struct
dhcp_packet
*
)
daemon
->
dhcp_packet
.
iov_base
;
unsigned
char
*
end
=
(
unsigned
char
*
)(
mess
+
1
);
unsigned
char
*
end
=
(
unsigned
char
*
)(
mess
+
1
);
unsigned
char
*
real_end
=
(
unsigned
char
*
)(
mess
+
1
);
unsigned
char
*
real_end
=
(
unsigned
char
*
)(
mess
+
1
);
...
@@ -1073,6 +1073,13 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
...
@@ -1073,6 +1073,13 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
log_tags
(
tagif_netid
,
ntohl
(
mess
->
xid
));
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
))
{
rapid_commit
=
1
;
goto
rapid_commit
;
}
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
);
time
=
calc_time
(
context
,
config
,
option_find
(
mess
,
sz
,
OPTION_LEASE_TIME
,
4
));
time
=
calc_time
(
context
,
config
,
option_find
(
mess
,
sz
,
OPTION_LEASE_TIME
,
4
));
...
@@ -1085,7 +1092,8 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
...
@@ -1085,7 +1092,8 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
netid
,
subnet_addr
,
fqdn_flags
,
borken_opt
,
pxearch
,
uuid
,
vendor_class_len
,
now
,
time
,
fuzz
);
netid
,
subnet_addr
,
fqdn_flags
,
borken_opt
,
pxearch
,
uuid
,
vendor_class_len
,
now
,
time
,
fuzz
);
return
dhcp_packet_size
(
mess
,
agent_id
,
real_end
);
return
dhcp_packet_size
(
mess
,
agent_id
,
real_end
);
case
DHCPREQUEST
:
case
DHCPREQUEST
:
if
(
ignore
||
have_config
(
config
,
CONFIG_DISABLE
))
if
(
ignore
||
have_config
(
config
,
CONFIG_DISABLE
))
return
0
;
return
0
;
...
@@ -1183,9 +1191,10 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
...
@@ -1183,9 +1191,10 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
fuzz
=
rand16
();
fuzz
=
rand16
();
mess
->
yiaddr
=
mess
->
ciaddr
;
mess
->
yiaddr
=
mess
->
ciaddr
;
}
}
log_packet
(
"DHCPREQUEST"
,
&
mess
->
yiaddr
,
emac
,
emac_len
,
iface_name
,
NULL
,
NULL
,
mess
->
xid
);
log_packet
(
"DHCPREQUEST"
,
&
mess
->
yiaddr
,
emac
,
emac_len
,
iface_name
,
NULL
,
NULL
,
mess
->
xid
);
rapid_commit:
if
(
!
message
)
if
(
!
message
)
{
{
struct
dhcp_config
*
addr_config
;
struct
dhcp_config
*
addr_config
;
...
@@ -1256,7 +1265,11 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
...
@@ -1256,7 +1265,11 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
if
(
message
)
if
(
message
)
{
{
log_packet
(
"DHCPNAK"
,
&
mess
->
yiaddr
,
emac
,
emac_len
,
iface_name
,
NULL
,
message
,
mess
->
xid
);
log_packet
(
rapid_commit
?
"NOANSWER"
:
"DHCPNAK"
,
&
mess
->
yiaddr
,
emac
,
emac_len
,
iface_name
,
NULL
,
message
,
mess
->
xid
);
/* rapid commit case: lease allocate failed but don't send DHCPNAK */
if
(
rapid_commit
)
return
0
;
mess
->
yiaddr
.
s_addr
=
0
;
mess
->
yiaddr
.
s_addr
=
0
;
clear_packet
(
mess
,
end
);
clear_packet
(
mess
,
end
);
...
@@ -1414,12 +1427,14 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
...
@@ -1414,12 +1427,14 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
override
=
lease
->
override
;
override
=
lease
->
override
;
log_packet
(
"DHCPACK"
,
&
mess
->
yiaddr
,
emac
,
emac_len
,
iface_name
,
hostname
,
NULL
,
mess
->
xid
);
log_packet
(
"DHCPACK"
,
&
mess
->
yiaddr
,
emac
,
emac_len
,
iface_name
,
hostname
,
NULL
,
mess
->
xid
);
clear_packet
(
mess
,
end
);
clear_packet
(
mess
,
end
);
option_put
(
mess
,
end
,
OPTION_MESSAGE_TYPE
,
1
,
DHCPACK
);
option_put
(
mess
,
end
,
OPTION_MESSAGE_TYPE
,
1
,
DHCPACK
);
option_put
(
mess
,
end
,
OPTION_SERVER_IDENTIFIER
,
INADDRSZ
,
ntohl
(
server_id
(
context
,
override
,
fallback
).
s_addr
));
option_put
(
mess
,
end
,
OPTION_SERVER_IDENTIFIER
,
INADDRSZ
,
ntohl
(
server_id
(
context
,
override
,
fallback
).
s_addr
));
option_put
(
mess
,
end
,
OPTION_LEASE_TIME
,
4
,
time
);
option_put
(
mess
,
end
,
OPTION_LEASE_TIME
,
4
,
time
);
do_options
(
context
,
mess
,
end
,
req_options
,
hostname
,
get_domain
(
mess
->
yiaddr
),
if
(
rapid_commit
)
option_put
(
mess
,
end
,
OPTION_RAPID_COMMIT
,
0
,
0
);
do_options
(
context
,
mess
,
end
,
req_options
,
hostname
,
get_domain
(
mess
->
yiaddr
),
netid
,
subnet_addr
,
fqdn_flags
,
borken_opt
,
pxearch
,
uuid
,
vendor_class_len
,
now
,
time
,
fuzz
);
netid
,
subnet_addr
,
fqdn_flags
,
borken_opt
,
pxearch
,
uuid
,
vendor_class_len
,
now
,
time
,
fuzz
);
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment