X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=networking%2Fudhcp%2Fserverpacket.c;h=cfead413cf3675f9bcbea4868d2d768b19912d5d;hb=e40c04b82695c1cde8ad9ed1e2aa1756463d73a7;hp=bc9d822a9ee3b7d2322ab95a28a1930308c05455;hpb=aff114c33d2b8879233fa513e6d760d0ef99b632;p=oweals%2Fbusybox.git diff --git a/networking/udhcp/serverpacket.c b/networking/udhcp/serverpacket.c index bc9d822a9..cfead413c 100644 --- a/networking/udhcp/serverpacket.c +++ b/networking/udhcp/serverpacket.c @@ -1,3 +1,4 @@ +/* vi: set sw=4 ts=4: */ /* serverpacket.c * * Construct and send DHCP server packets @@ -25,17 +26,18 @@ #include #include +#include "common.h" #include "serverpacket.h" #include "dhcpd.h" #include "options.h" -#include "common.h" +#include "static_leases.h" /* send a packet to giaddr using the kernel ip stack */ static int send_packet_to_relay(struct dhcpMessage *payload) { - DEBUG(LOG_INFO, "Forwarding packet to relay"); + DEBUG("Forwarding packet to relay"); - return kernel_packet(payload, server_config.server, SERVER_PORT, + return udhcp_kernel_packet(payload, server_config.server, SERVER_PORT, payload->giaddr, SERVER_PORT); } @@ -47,23 +49,23 @@ static int send_packet_to_client(struct dhcpMessage *payload, int force_broadcas uint32_t ciaddr; if (force_broadcast) { - DEBUG(LOG_INFO, "broadcasting packet to client (NAK)"); + DEBUG("broadcasting packet to client (NAK)"); ciaddr = INADDR_BROADCAST; chaddr = MAC_BCAST_ADDR; } else if (payload->ciaddr) { - DEBUG(LOG_INFO, "unicasting packet to client ciaddr"); + DEBUG("unicasting packet to client ciaddr"); ciaddr = payload->ciaddr; chaddr = payload->chaddr; } else if (ntohs(payload->flags) & BROADCAST_FLAG) { - DEBUG(LOG_INFO, "broadcasting packet to client (requested)"); + DEBUG("broadcasting packet to client (requested)"); ciaddr = INADDR_BROADCAST; chaddr = MAC_BCAST_ADDR; } else { - DEBUG(LOG_INFO, "unicasting packet to client yiaddr"); + DEBUG("unicasting packet to client yiaddr"); ciaddr = payload->yiaddr; chaddr = payload->chaddr; } - return raw_packet(payload, server_config.server, SERVER_PORT, + return udhcp_raw_packet(payload, server_config.server, SERVER_PORT, ciaddr, CLIENT_PORT, chaddr, server_config.ifindex); } @@ -82,7 +84,7 @@ static int send_packet(struct dhcpMessage *payload, int force_broadcast) static void init_packet(struct dhcpMessage *packet, struct dhcpMessage *oldpacket, char type) { - init_header(packet, type); + udhcp_init_header(packet, type); packet->xid = oldpacket->xid; memcpy(packet->chaddr, oldpacket->chaddr, 16); packet->flags = oldpacket->flags; @@ -97,9 +99,9 @@ static void add_bootp_options(struct dhcpMessage *packet) { packet->siaddr = server_config.siaddr; if (server_config.sname) - strncpy(packet->sname, server_config.sname, sizeof(packet->sname) - 1); + strncpy((char*)packet->sname, server_config.sname, sizeof(packet->sname) - 1); if (server_config.boot_file) - strncpy(packet->file, server_config.boot_file, sizeof(packet->file) - 1); + strncpy((char*)packet->file, server_config.boot_file, sizeof(packet->file) - 1); } @@ -113,9 +115,15 @@ int sendOffer(struct dhcpMessage *oldpacket) struct option_set *curr; struct in_addr addr; + uint32_t static_lease_ip; + init_packet(&packet, oldpacket, DHCPOFFER); + static_lease_ip = getIpByMac(server_config.static_leases, oldpacket->chaddr); + /* ADDME: if static, short circuit */ + if(!static_lease_ip) + { /* the client is in our lease/offered table */ if ((lease = find_lease_by_chaddr(oldpacket->chaddr))) { if (!lease_expired(lease)) @@ -131,16 +139,18 @@ int sendOffer(struct dhcpMessage *oldpacket) /* and the ip is in the lease range */ ntohl(req_align) >= ntohl(server_config.start) && ntohl(req_align) <= ntohl(server_config.end) && - - /* and its not already taken/offered */ /* ADDME: check that its not a static lease */ + + !static_lease_ip && /* Check that its not a static lease */ + /* and is not already taken/offered */ ((!(lease = find_lease_by_yiaddr(req_align)) || - + /* or its taken, but expired */ /* ADDME: or maybe in here */ lease_expired(lease)))) { packet.yiaddr = req_align; /* FIXME: oh my, is there a host using this IP? */ - /* otherwise, find a free IP */ /*ADDME: is it a static lease? */ + /* otherwise, find a free IP */ } else { + /* Is it a static lease? (No, because find_address skips static lease) */ packet.yiaddr = find_address(0); /* try for an expired lease */ @@ -148,12 +158,12 @@ int sendOffer(struct dhcpMessage *oldpacket) } if(!packet.yiaddr) { - LOG(LOG_WARNING, "no IP addresses to give -- OFFER abandoned"); + bb_error_msg("No IP addresses to give - OFFER abandoned"); return -1; } if (!add_lease(packet.chaddr, packet.yiaddr, server_config.offer_time)) { - LOG(LOG_WARNING, "lease pool is full -- OFFER abandoned"); + bb_error_msg("Lease pool is full - OFFER abandoned"); return -1; } @@ -167,7 +177,14 @@ int sendOffer(struct dhcpMessage *oldpacket) /* Make sure we aren't just using the lease time from the previous offer */ if (lease_time_align < server_config.min_lease) lease_time_align = server_config.lease; + } /* ADDME: end of short circuit */ + else + { + /* It is a static lease... use it */ + packet.yiaddr = static_lease_ip; + } + add_simple_option(packet.options, DHCP_LEASE_TIME, htonl(lease_time_align)); curr = server_config.options; @@ -180,7 +197,7 @@ int sendOffer(struct dhcpMessage *oldpacket) add_bootp_options(&packet); addr.s_addr = packet.yiaddr; - LOG(LOG_INFO, "sending OFFER of %s", inet_ntoa(addr)); + bb_info_msg("Sending OFFER of %s", inet_ntoa(addr)); return send_packet(&packet, 0); } @@ -191,7 +208,7 @@ int sendNAK(struct dhcpMessage *oldpacket) init_packet(&packet, oldpacket, DHCPNAK); - DEBUG(LOG_INFO, "sending NAK"); + DEBUG("Sending NAK"); return send_packet(&packet, 1); } @@ -228,7 +245,7 @@ int sendACK(struct dhcpMessage *oldpacket, uint32_t yiaddr) add_bootp_options(&packet); addr.s_addr = packet.yiaddr; - LOG(LOG_INFO, "sending ACK to %s", inet_ntoa(addr)); + bb_info_msg("Sending ACK to %s", inet_ntoa(addr)); if (send_packet(&packet, 0) < 0) return -1;