diff -ruN ../dhcp-3.0.5.b4/server/dhcp.c ./server/dhcp.c --- ../dhcp-3.0.5.b4/server/dhcp.c Tue Jan 22 21:37:04 2008 +++ ./server/dhcp.c Tue Jan 22 21:48:36 2008 @@ -45,6 +45,13 @@ */ #define LOG_AGENT_OPTIONS 1 +/* + * This setting is a hack that makes the server log and send to + * the source IP address from the request packet instead + * of the giaddr in the packet, in cases where it would use giaddr. + */ +#define USE_CLIENT_IP_INSTEAD_OF_GIADDR 1 + int outstanding_pings; static char dhcp_message [256]; @@ -65,6 +72,33 @@ # define send_packet trace_packet_send #endif +#if USE_CLIENT_IP_INSTEAD_OF_GIADDR +char *packet_src_info(struct packet *packet) +{ + static char res[128]; + char giaddr[20]; + char client[20]; + + inet_ntop(AF_INET, &packet->raw->giaddr, giaddr, sizeof(giaddr)); + inet_ntop(AF_INET, &packet->client_addr.iabuf, client, sizeof(client)); + + if (strcmp(giaddr, client) == 0) + snprintf(res, sizeof(res), "%s", client); + else + snprintf(res, sizeof(res), "%s (giaddr %s)", client, giaddr); + + return res; +} + +char *piaddr2(struct iaddr iaddr) +{ + static char res[128]; + + inet_ntop(AF_INET, iaddr.iabuf, res, sizeof(res)); + return res; +} +#endif + void dhcp (packet) struct packet *packet; { @@ -98,7 +132,11 @@ packet -> raw -> chaddr) : ""), packet -> raw -> giaddr.s_addr +#if USE_CLIENT_IP_INSTEAD_OF_GIADDR + ? packet_src_info(packet) +#else ? inet_ntoa (packet -> raw -> giaddr) +#endif : packet -> interface -> name, errmsg); goto out; } @@ -353,13 +391,21 @@ s ? "(" : "", s ? s : "", s ? ") " : "", agentbuf, packet -> raw -> giaddr.s_addr +#if USE_CLIENT_IP_INSTEAD_OF_GIADDR + ? packet_src_info(packet) +#else ? inet_ntoa (packet -> raw -> giaddr) +#endif : packet -> interface -> name); /* Sourceless packets don't make sense here. */ if (!packet -> shared_network) { log_info ("Packet from unknown subnet: %s", +#if USE_CLIENT_IP_INSTEAD_OF_GIADDR + packet_src_info(packet)); +#else inet_ntoa (packet -> raw -> giaddr)); +#endif goto out; } @@ -547,7 +593,11 @@ : "")), s ? "(" : "", s ? s : "", s ? ") " : "", packet -> raw -> giaddr.s_addr +#if USE_CLIENT_IP_INSTEAD_OF_GIADDR + ? packet_src_info(packet) +#else ? inet_ntoa (packet -> raw -> giaddr) +#endif : packet -> interface -> name); #if defined (FAILOVER_PROTOCOL) @@ -839,7 +889,11 @@ : "")), s ? "(" : "", s ? s : "", s ? ") " : "", packet -> raw -> giaddr.s_addr +#if USE_CLIENT_IP_INSTEAD_OF_GIADDR + ? packet_src_info(packet) +#else ? inet_ntoa (packet -> raw -> giaddr) +#endif : packet -> interface -> name, lease ? "" : "not "); @@ -929,7 +983,11 @@ : "")), s ? "(" : "", s ? s : "", s ? ") " : "", packet -> raw -> giaddr.s_addr +#if USE_CLIENT_IP_INSTEAD_OF_GIADDR + ? packet_src_info(packet) +#else ? inet_ntoa (packet -> raw -> giaddr) +#endif : packet -> interface -> name); option_state_allocate (&options, MDL); @@ -1039,7 +1097,11 @@ */ snprintf (msgbuf, sizeof msgbuf, "DHCPINFORM from %s via %s", piaddr (cip), packet->raw->giaddr.s_addr ? +#if USE_CLIENT_IP_INSTEAD_OF_GIADDR + packet_src_info(packet) : +#else inet_ntoa(packet->raw->giaddr) : +#endif packet -> interface -> name); /* If the IP source address is zero, don't respond. */ @@ -1345,7 +1407,11 @@ * If ciaddr is not zero, send the packet there always. */ if (!raw.ciaddr.s_addr && gip.len) { +#if USE_CLIENT_IP_INSTEAD_OF_GIADDR + memcpy(&to.sin_addr, packet->client_addr.iabuf, 4); +#else memcpy(&to.sin_addr, gip.iabuf, 4); +#endif to.sin_port = local_port; raw.flags |= htons(BOOTP_BROADCAST); } else { @@ -1360,8 +1426,13 @@ print_hw_addr(packet->raw->htype, packet->raw->hlen, packet->raw->chaddr) : ""); +#if USE_CLIENT_IP_INSTEAD_OF_GIADDR + log_info("%s %s", msgbuf, gip.len ? piaddr(packet->client_addr) : + packet->interface->name); +#else log_info("%s %s", msgbuf, gip.len ? piaddr(gip) : packet->interface->name); +#endif errno = 0; send_packet ((fallback_interface @@ -1513,7 +1584,11 @@ packet -> raw -> hlen, packet -> raw -> chaddr), packet -> raw -> giaddr.s_addr +#if USE_CLIENT_IP_INSTEAD_OF_GIADDR + ? piaddr2(packet->client_addr) +#else ? inet_ntoa (packet -> raw -> giaddr) +#endif : packet -> interface -> name); @@ -1548,7 +1623,11 @@ /* If this was gatewayed, send it back to the gateway. Otherwise, broadcast it on the local network. */ if (raw.giaddr.s_addr) { +#if USE_CLIENT_IP_INSTEAD_OF_GIADDR + memcpy(&to.sin_addr, packet->client_addr.iabuf, 4); +#else to.sin_addr = raw.giaddr; +#endif if (raw.giaddr.s_addr != htonl (INADDR_LOOPBACK)) to.sin_port = local_port; else @@ -2923,7 +3002,11 @@ lease -> uid_len)), s ? "(" : "", s ? s : "", s ? ") " : "", (state -> giaddr.s_addr +#if USE_CLIENT_IP_INSTEAD_OF_GIADDR + ? piaddr2(state->packet->client_addr) +#else ? inet_ntoa (state -> giaddr) +#endif : state -> ip -> name)); /* Set up the hardware address... */ @@ -2947,7 +3030,11 @@ /* If this was gatewayed, send it back to the gateway... */ if (raw.giaddr.s_addr) { +#if USE_CLIENT_IP_INSTEAD_OF_GIADDR + memcpy(&to.sin_addr, state->packet->client_addr.iabuf, 4); +#else to.sin_addr = raw.giaddr; +#endif if (raw.giaddr.s_addr != htonl (INADDR_LOOPBACK)) to.sin_port = local_port; else