]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Fixes for DHCP lease query
authorAlan T. DeKok <aland@freeradius.org>
Sun, 30 Aug 2015 16:11:47 +0000 (12:11 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Sun, 30 Aug 2015 16:11:47 +0000 (12:11 -0400)
src/include/dhcp.h
src/modules/proto_dhcp/dhcp.c
src/modules/proto_dhcp/dhcpclient.c

index de48a2ffdfde98c2846ef252c37d99baa456260b..01fa781ded6d11d10881d3d09b879ff53ebfa73c 100644 (file)
@@ -64,6 +64,7 @@ RADIUS_PACKET *fr_dhcp_recv_raw_packet(int sockfd, struct sockaddr_ll *p_ll, RAD
 #define PW_DHCP_NAK            (1024 + 6)
 #define PW_DHCP_RELEASE                (1024 + 7)
 #define PW_DHCP_INFORM         (1024 + 8)
+#define PW_DHCP_LEASE_QUERY            (1024 + 10)
 
 #define DHCP_MAGIC_VENDOR (54)
 
index d6eca285e3dcffc71f3d976bd0934b43c3c3360b..0597f61c8e917272f3bd0933699b125afde31e6a 100644 (file)
@@ -336,8 +336,8 @@ RADIUS_PACKET *fr_dhcp_recv(int sockfd)
                return NULL;
        }
 
-       if ((code[1] < 1) || (code[2] == 0) || (code[2] > 11)) {
-               fr_strerror_printf("Unknown value for message-type option");
+       if ((code[1] < 1) || (code[2] == 0) || (code[2] > 15)) {
+               fr_strerror_printf("Unknown value %d for message-type option", code[2]);
                rad_free(&packet);
                return NULL;
        }
@@ -397,7 +397,7 @@ RADIUS_PACKET *fr_dhcp_recv(int sockfd)
                char src_ip_buf[256], dst_ip_buf[256];
 
                if ((packet->code >= PW_DHCP_DISCOVER) &&
-                   (packet->code <= (1024 + 11))) {
+                   (packet->code <= (1024 + 15))) {
                        name = dhcp_message_types[packet->code - PW_DHCP_OFFSET];
                } else {
                        snprintf(type_buf, sizeof(type_buf), "%d",
@@ -452,7 +452,7 @@ int fr_dhcp_send(RADIUS_PACKET *packet)
                char dst_ip_buf[INET6_ADDRSTRLEN];
 
                if ((packet->code >= PW_DHCP_DISCOVER) &&
-                   (packet->code <= (1024 + 11))) {
+                   (packet->code <= (1024 + 15))) {
                        name = dhcp_message_types[packet->code - PW_DHCP_OFFSET];
                } else {
                        snprintf(type_buf, sizeof(type_buf), "%d",
@@ -969,7 +969,7 @@ int fr_dhcp_decode(RADIUS_PACKET *packet)
                        /*
                         *      Skip chaddr if it doesn't exist.
                         */
-                       if ((packet->data[1] == 0) || (packet->data[2] == 2)) continue;
+                       if ((packet->data[1] == 0) || (packet->data[2] == 0)) continue;
 
                        if ((packet->data[1] == 1) && (packet->data[2] != sizeof(vp->vp_ether))) {
                                DICT_ATTR const *da = dict_unknown_afrom_fields(packet, vp->da->attr, vp->da->vendor);
@@ -1410,7 +1410,7 @@ int fr_dhcp_encode(RADIUS_PACKET *packet)
 
 #ifndef NDEBUG
        if ((packet->code >= PW_DHCP_DISCOVER) &&
-           (packet->code <= (1024 + 11))) {
+           (packet->code <= (1024 + 15))) {
                name = dhcp_message_types[packet->code - PW_DHCP_OFFSET];
        } else {
                name = "?Unknown?";
@@ -1879,7 +1879,7 @@ int fr_dhcp_send_raw_packet(int sockfd, struct sockaddr_ll *p_ll, RADIUS_PACKET
                char dst_ip_buf[INET6_ADDRSTRLEN];
 
                if ((packet->code >= PW_DHCP_DISCOVER) &&
-                   (packet->code <= (1024 + 11))) {
+                   (packet->code <= (1024 + 15))) {
                        name = dhcp_message_types[packet->code - PW_DHCP_OFFSET];
                } else {
                        snprintf(type_buf, sizeof(type_buf), "%d",
@@ -2082,7 +2082,7 @@ RADIUS_PACKET *fr_dhcp_recv_raw_packet(int sockfd, struct sockaddr_ll *p_ll, RAD
                char src_ip_buf[256], dst_ip_buf[256];
 
                if ((packet->code >= PW_DHCP_DISCOVER) &&
-                   (packet->code <= (1024 + 11))) {
+                   (packet->code <= (1024 + 15))) {
                        name = dhcp_message_types[packet->code - PW_DHCP_OFFSET];
                } else {
                        snprintf(type_buf, sizeof(type_buf), "%d", packet->code - PW_DHCP_OFFSET);
index 94bd14426fcec12c52d8c2492f128a452068674b..76e5e0ab9312117435bd50f006d33866ee7258b6 100644 (file)
@@ -88,6 +88,7 @@ static const FR_NAME_NUMBER request_types[] = {
        { "decline",  PW_DHCP_DECLINE },
        { "release",  PW_DHCP_RELEASE },
        { "inform",   PW_DHCP_INFORM },
+       { "lease_query",  PW_DHCP_LEASE_QUERY },
        { "auto",     PW_CODE_UNDEFINED },
        { NULL, 0}
 };
@@ -544,7 +545,7 @@ int main(int argc, char **argv)
                        packet_code = atoi(argv[2]);
                }
        }
-       if (server_port == 0) server_port = 67;
+       if (!server_port) server_port = 67;
 
        request_init(filename);
 
@@ -570,6 +571,11 @@ int main(int argc, char **argv)
                reply_expected = false;
        }
 
+       /*
+        *      Always true for DHCP
+        */
+       client_port = server_port + 1;
+
        /*
         *      Bind to the first specified IP address and port.
         *      This means we ignore later ones.
@@ -577,10 +583,8 @@ int main(int argc, char **argv)
        if (request->src_ipaddr.af == AF_UNSPEC) {
                memset(&client_ipaddr, 0, sizeof(client_ipaddr));
                client_ipaddr.af = server_ipaddr.af;
-               client_port = 0;
        } else {
                client_ipaddr = request->src_ipaddr;
-               client_port = request->src_port;
        }
        
        /* set "raw mode" if an interface is specified and if destination IP address is the broadcast address. */