From: Alan T. DeKok Date: Sun, 30 Aug 2015 16:11:47 +0000 (-0400) Subject: Fixes for DHCP lease query X-Git-Tag: release_3_0_10~192 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=517b0cfa104d30c84316c7d8fdc5b17d43ef553b;p=thirdparty%2Ffreeradius-server.git Fixes for DHCP lease query --- diff --git a/src/include/dhcp.h b/src/include/dhcp.h index de48a2ffdfd..01fa781ded6 100644 --- a/src/include/dhcp.h +++ b/src/include/dhcp.h @@ -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) diff --git a/src/modules/proto_dhcp/dhcp.c b/src/modules/proto_dhcp/dhcp.c index d6eca285e3d..0597f61c8e9 100644 --- a/src/modules/proto_dhcp/dhcp.c +++ b/src/modules/proto_dhcp/dhcp.c @@ -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); diff --git a/src/modules/proto_dhcp/dhcpclient.c b/src/modules/proto_dhcp/dhcpclient.c index 94bd14426fc..76e5e0ab931 100644 --- a/src/modules/proto_dhcp/dhcpclient.c +++ b/src/modules/proto_dhcp/dhcpclient.c @@ -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. */