Author: markj
Date: Tue May 21 21:22:43 2019
New Revision: 348066
URL: https://svnweb.freebsd.org/changeset/base/348066

Log:
  bootpd: Add an option to skip modifications to the ARP table.
  
  PR:           30854
  Submitted by: Dan Lukes <d...@obluda.cz>
  Reviewed by:  imp (previous version)
  MFC after:    1 week
  Event:                Waterloo Hackathon 2019
  Differential Revision:        https://reviews.freebsd.org/D2581

Modified:
  head/libexec/bootpd/bootpd.8
  head/libexec/bootpd/bootpd.c
  head/libexec/bootpd/bootpgw/bootpgw.c

Modified: head/libexec/bootpd/bootpd.8
==============================================================================
--- head/libexec/bootpd/bootpd.8        Tue May 21 21:14:22 2019        
(r348065)
+++ head/libexec/bootpd/bootpd.8        Tue May 21 21:22:43 2019        
(r348066)
@@ -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 r
 .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

Modified: head/libexec/bootpd/bootpd.c
==============================================================================
--- head/libexec/bootpd/bootpd.c        Tue May 21 21:14:22 2019        
(r348065)
+++ head/libexec/bootpd/bootpd.c        Tue May 21 21:22:43 2019        
(r348066)
@@ -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) &&

Modified: head/libexec/bootpd/bootpgw/bootpgw.c
==============================================================================
--- head/libexec/bootpd/bootpgw/bootpgw.c       Tue May 21 21:14:22 2019        
(r348065)
+++ head/libexec/bootpd/bootpgw/bootpgw.c       Tue May 21 21:22:43 2019        
(r348066)
@@ -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 (arpmod) {
+               /* Create an ARP cache entry for the client. */
+               ha = bp->bp_chaddr;
+               len = bp->bp_hlen;
+               struct in_addr dst;
 
-       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 (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,
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to