]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
Add support for use-lease-addr-for-default-route
authorTed Lemon <source@isc.org>
Thu, 4 Feb 1999 22:13:04 +0000 (22:13 +0000)
committerTed Lemon <source@isc.org>
Thu, 4 Feb 1999 22:13:04 +0000 (22:13 +0000)
includes/dhcpd.h
includes/dhctoken.h
server/confpars.c
server/dhcp.c

index b78e6e8dd54231ff51540e557a05feeb6204b382..0457108a26444cdf49d866a1cadf10a11e8f8f37 100644 (file)
@@ -207,6 +207,7 @@ struct group {
        int one_lease_per_client;
        int get_lease_hostnames;
        int use_host_decl_names;
+       int use_lease_addr_for_default_route;
 
        struct tree_cache *options [256];
 };
index f7014b46cec842bc660e7e659bd24f885aabf96b..091d461bfe9c5b2e52d999a9c9bf353e0d62fec8 100644 (file)
 #define CLIENT_HOSTNAME        329
 #define REJECT         330
 #define FDDI           331
+#define USE_LEASE_ADDR_FOR_DEFAULT_ROUTE 332
 
 #define is_identifier(x)       ((x) >= FIRST_TOKEN &&  \
                                 (x) != STRING &&       \
index a938fbcb8dfdb03165395b6d2704c28b8a17cb61..30753e75847faa753e6719f68b6484c0adba02d9 100644 (file)
@@ -42,7 +42,7 @@
 
 #ifndef lint
 static char copyright[] =
-"$Id: confpars.c,v 1.45.2.4 1998/11/24 23:02:54 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium.  All rights reserved.\n";
+"$Id: confpars.c,v 1.45.2.5 1999/02/04 22:13:02 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium.  All rights reserved.\n";
 #endif /* not lint */
 
 #include "dhcpd.h"
@@ -155,6 +155,7 @@ void read_leases ()
               | fixed-address-parameter
               | ALLOW allow-deny-keyword
               | DENY allow-deny-keyword
+              | USE_LEASE_ADDR_FOR_DEFAULT_ROUTE boolean
 
    declaration :== host-declaration
                 | group-declaration
@@ -301,6 +302,11 @@ int parse_statement (cfile, group, type, host_decl, declaration)
                group -> use_host_decl_names = parse_boolean (cfile);
                break;
 
+             case USE_LEASE_ADDR_FOR_DEFAULT_ROUTE:
+               group -> use_lease_addr_for_default_route =
+                       parse_boolean (cfile);
+               break;
+
              case NEXT_SERVER:
                tree = parse_ip_addr_or_hostname (cfile, 0);
                if (!tree)
index 44d81817c05da4221e0cd7b68e6de0c79aecc3c0..ede3fe042870b88a5b4f534787d8b030fe1f8348 100644 (file)
@@ -42,7 +42,7 @@
 
 #ifndef lint
 static char copyright[] =
-"$Id: dhcp.c,v 1.57.2.13 1999/02/03 19:46:05 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium.  All rights reserved.\n";
+"$Id: dhcp.c,v 1.57.2.14 1999/02/04 22:13:04 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium.  All rights reserved.\n";
 #endif /* not lint */
 
 #include "dhcpd.h"
@@ -549,6 +549,7 @@ void ack_lease (packet, lease, offer, when)
        struct lease_state *state;
        TIME lease_time;
        TIME offered_lease_time;
+       int ulafdr;
 
        struct class *vendor_class, *user_class;
        int i;
@@ -1002,6 +1003,40 @@ void ack_lease (packet, lease, offer, when)
                state -> options [i] -> tree = (struct tree *)0;
        }
 
+       /* If so directed, use the leased IP address as the router address.
+          This supposedly makes Win95 machines ARP for all IP addresses,
+          so if the local router does proxy arp, you win. */
+
+       ulafdr = 0;
+       if (lease -> host) {
+               if (lease -> host -> group -> use_lease_addr_for_default_route)
+                       ulafdr = 1;
+       } else if (user_class) {
+               if (user_class -> group -> use_lease_addr_for_default_route)
+                       ulafdr = 1;
+       } else if (vendor_class) {
+               if (vendor_class -> group -> use_lease_addr_for_default_route)
+                       ulafdr = 1;
+       } else if (lease -> subnet -> group ->
+                  use_lease_addr_for_default_route)
+               ulafdr = 1;
+       else
+               ulafdr = 0;
+
+       i = DHO_ROUTERS;
+       if (ulafdr && !state -> options [i]) {
+               state -> options [i] = new_tree_cache ("routers");
+               state -> options [i] -> flags = TC_TEMPORARY;
+               state -> options [i] -> value =
+                       lease -> ip_addr.iabuf;
+               state -> options [i] -> len =
+                       lease -> ip_addr.len;
+               state -> options [i] -> buf_size =
+                       lease -> ip_addr.len;
+               state -> options [i] -> timeout = 0xFFFFFFFF;
+               state -> options [i] -> tree = (struct tree *)0;
+       }
+
 #ifdef DEBUG_PACKET
        dump_packet (packet);
        dump_raw ((unsigned char *)packet -> raw, packet -> packet_length);