aboutsummaryrefslogtreecommitdiff
path: root/libexec/bootpd
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2019-05-21 21:22:43 +0000
committerMark Johnston <markj@FreeBSD.org>2019-05-21 21:22:43 +0000
commit35131b461677fa6c1d7bb8d47a11058e32c4be82 (patch)
tree982f2a2c8ede1c29064943bb44b53db3701a11b9 /libexec/bootpd
parent594d1c7235ecf666193b17396844f2ec235ba566 (diff)
downloadsrc-35131b461677fa6c1d7bb8d47a11058e32c4be82.tar.gz
src-35131b461677fa6c1d7bb8d47a11058e32c4be82.zip
bootpd: Add an option to skip modifications to the ARP table.
PR: 30854 Submitted by: Dan Lukes <dan@obluda.cz> Reviewed by: imp (previous version) MFC after: 1 week Event: Waterloo Hackathon 2019 Differential Revision: https://reviews.freebsd.org/D2581
Notes
Notes: svn path=/head/; revision=348066
Diffstat (limited to 'libexec/bootpd')
-rw-r--r--libexec/bootpd/bootpd.84
-rw-r--r--libexec/bootpd/bootpd.c17
-rw-r--r--libexec/bootpd/bootpgw/bootpgw.c37
3 files changed, 38 insertions, 20 deletions
diff --git a/libexec/bootpd/bootpd.8 b/libexec/bootpd/bootpd.8
index d12480025325..8630f0525853 100644
--- a/libexec/bootpd/bootpd.8
+++ b/libexec/bootpd/bootpd.8
@@ -2,7 +2,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd February 10, 2004
+.Dd May 21, 2019
.Dt BOOTPD 8
.Os
.Sh NAME
@@ -103,6 +103,8 @@ option may be used to force standalone or inetd mode respectively
.Sh OPTIONS
The following options are available:
.Bl -tag -width indent
+.It Fl a
+Skip ARP table modifications.
.It Fl t Ar timeout
Specify the
.Ar timeout
diff --git a/libexec/bootpd/bootpd.c b/libexec/bootpd/bootpd.c
index afd5c77d6a99..507678a57a16 100644
--- a/libexec/bootpd/bootpd.c
+++ b/libexec/bootpd/bootpd.c
@@ -143,6 +143,7 @@ struct timeval actualtimeout =
15 * 60L, /* tv_sec */
0 /* tv_usec */
};
+int arpmod = TRUE; /* modify the ARP table */
/*
* General
@@ -266,6 +267,9 @@ main(argc, argv)
break;
switch (argv[0][1]) {
+ case 'a': /* don't modify the ARP table */
+ arpmod = FALSE;
+ break;
case 'c': /* chdir_path */
if (argv[0][2]) {
stmp = &(argv[0][2]);
@@ -583,8 +587,9 @@ PRIVATE void
usage()
{
fprintf(stderr,
- "usage: bootpd [-i | -s] [-c chdir-path] [-d level] [-h hostname] [-t timeout]\n");
+ "usage: bootpd [-a] [-i | -s] [-c chdir-path] [-d level] [-h hostname] [-t timeout]\n");
fprintf(stderr, " [bootptab [dumpfile]]\n");
+ fprintf(stderr, "\t -a\tdon't modify ARP table\n");
fprintf(stderr, "\t -c n\tset current directory\n");
fprintf(stderr, "\t -d n\tset debug level\n");
fprintf(stderr, "\t -h n\tset the hostname to listen on\n");
@@ -1067,10 +1072,12 @@ sendreply(forward, dst_override)
if (haf == 0)
haf = HTYPE_ETHERNET;
- if (debug > 1)
- report(LOG_INFO, "setarp %s - %s",
- inet_ntoa(dst), haddrtoa(ha, len));
- setarp(s, &dst, haf, ha, len);
+ if (arpmod) {
+ if (debug > 1)
+ report(LOG_INFO, "setarp %s - %s",
+ inet_ntoa(dst), haddrtoa(ha, len));
+ setarp(s, &dst, haf, ha, len);
+ }
}
if ((forward == 0) &&
diff --git a/libexec/bootpd/bootpgw/bootpgw.c b/libexec/bootpd/bootpgw/bootpgw.c
index 16bb66b2d292..cdc8e8adc317 100644
--- a/libexec/bootpd/bootpgw/bootpgw.c
+++ b/libexec/bootpd/bootpgw/bootpgw.c
@@ -124,6 +124,7 @@ struct timeval actualtimeout =
u_char maxhops = 4; /* Number of hops allowed for requests. */
u_int minwait = 3; /* Number of seconds client must wait before
its bootrequest packets are forwarded. */
+int arpmod = TRUE; /* modify the ARP table */
/*
* General
@@ -238,6 +239,9 @@ main(argc, argv)
break;
switch (argv[0][1]) {
+ case 'a': /* don't modify the ARP table */
+ arpmod = FALSE;
+ break;
case 'd': /* debug level */
if (argv[0][2]) {
stmp = &(argv[0][2]);
@@ -496,7 +500,8 @@ static void
usage()
{
fprintf(stderr,
- "usage: bootpgw [-d level] [-i] [-s] [-t timeout] server\n");
+ "usage: \nbootpgw [-a] [-d level] [-h count] [-i] [-s] [-t timeout] [-w time] server\n");
+ fprintf(stderr, "\t -a\tdon't modify ARP table\n");
fprintf(stderr, "\t -d n\tset debug level\n");
fprintf(stderr, "\t -h n\tset max hop count\n");
fprintf(stderr, "\t -i\tforce inetd mode (run as child of inetd)\n");
@@ -641,19 +646,23 @@ handle_reply()
send_addr.sin_addr = bp->bp_yiaddr;
send_addr.sin_port = htons(bootpc_port);
- /* Create an ARP cache entry for the client. */
- ha = bp->bp_chaddr;
- len = bp->bp_hlen;
- if (len > MAXHADDRLEN)
- len = MAXHADDRLEN;
- haf = (int) bp->bp_htype;
- if (haf == 0)
- haf = HTYPE_ETHERNET;
-
- if (debug > 1)
- report(LOG_INFO, "setarp %s - %s",
- inet_ntoa(bp->bp_yiaddr), haddrtoa(ha, len));
- setarp(s, &bp->bp_yiaddr, haf, ha, len);
+ if (arpmod) {
+ /* Create an ARP cache entry for the client. */
+ ha = bp->bp_chaddr;
+ len = bp->bp_hlen;
+ struct in_addr dst;
+
+ if (len > MAXHADDRLEN)
+ len = MAXHADDRLEN;
+ haf = (int) bp->bp_htype;
+ if (haf == 0)
+ haf = HTYPE_ETHERNET;
+
+ if (debug > 1)
+ report(LOG_INFO, "setarp %s - %s",
+ inet_ntoa(dst), haddrtoa(ha, len));
+ setarp(s, &dst, haf, ha, len);
+ }
/* Send reply with same size packet as request used. */
if (sendto(s, pktbuf, pktlen, 0,