static void send_packet(struct dhcp_packet *dhcp_pkt, int force_broadcast) { if (dhcp_pkt->gateway_nip) send_packet_to_relay(dhcp_pkt); else send_packet_to_client(dhcp_pkt, force_broadcast); }
static void send_ACK(GDHCPServer *dhcp_server, struct dhcp_packet *client_packet, uint32_t dest) { struct dhcp_packet packet; uint32_t lease_time_sec; struct in_addr addr; init_packet(dhcp_server, &packet, client_packet, DHCPACK); packet.yiaddr = htonl(dest); lease_time_sec = dhcp_server->lease_seconds; dhcp_add_option_uint32(&packet, DHCP_LEASE_TIME, lease_time_sec); add_server_options(dhcp_server, &packet); addr.s_addr = htonl(dest); debug(dhcp_server, "Sending ACK to %s", inet_ntoa(addr)); send_packet_to_client(dhcp_server, &packet); add_lease(dhcp_server, 0, packet.chaddr, packet.yiaddr); if (dhcp_server->event_fn) dhcp_server->event_fn(ether_ntoa((void*)packet.chaddr), inet_ntoa(addr), dhcp_server->fn_data); }
static void send_inform(GDHCPServer *dhcp_server, struct dhcp_packet *client_packet) { struct dhcp_packet packet; init_packet(dhcp_server, &packet, client_packet, DHCPACK); add_server_options(dhcp_server, &packet); send_packet_to_client(dhcp_server, &packet); }
/* send a dhcp packet, if force broadcast is set, the packet will be broadcast to the client */ static int send_packet(struct dhcpMessage *payload, int force_broadcast) { int ret; if (payload->giaddr) ret = send_packet_to_relay(payload); else ret = send_packet_to_client(payload, force_broadcast); return ret; }
static void send_offer(GDHCPServer *dhcp_server, struct dhcp_packet *client_packet, struct dhcp_lease *lease, uint32_t requested_nip) { struct dhcp_packet packet; struct in_addr addr; init_packet(dhcp_server, &packet, client_packet, DHCPOFFER); if (lease) packet.yiaddr = htonl(lease->lease_nip); else if (check_requested_nip(dhcp_server, requested_nip)) packet.yiaddr = htonl(requested_nip); else packet.yiaddr = htonl(find_free_or_expired_nip( dhcp_server, client_packet->chaddr)); debug(dhcp_server, "find yiaddr %u", packet.yiaddr); if (!packet.yiaddr) { debug(dhcp_server, "Err: Can not found lease and send offer"); return; } lease = add_lease(dhcp_server, OFFER_TIME, packet.chaddr, packet.yiaddr); if (!lease) { debug(dhcp_server, "Err: No free IP addresses. OFFER abandoned"); return; } dhcp_add_option_uint32(&packet, DHCP_LEASE_TIME, dhcp_server->lease_seconds); add_server_options(dhcp_server, &packet); addr.s_addr = packet.yiaddr; debug(dhcp_server, "Sending OFFER of %s", inet_ntoa(addr)); send_packet_to_client(dhcp_server, &packet); }
static void send_ACK(GDHCPServer *dhcp_server, struct dhcp_packet *client_packet, uint32_t yiaddr) { struct dhcp_packet packet; uint32_t lease_time_sec; struct in_addr addr; init_packet(dhcp_server, &packet, client_packet, DHCPACK); packet.yiaddr = yiaddr; lease_time_sec = dhcp_server->lease_seconds; dhcp_add_simple_option(&packet, DHCP_LEASE_TIME, htonl(lease_time_sec)); add_server_options(dhcp_server, &packet); addr.s_addr = yiaddr; debug(dhcp_server, "Sending ACK to %s", inet_ntoa(addr)); send_packet_to_client(dhcp_server, &packet); add_lease(dhcp_server, 0, packet.chaddr, packet.yiaddr); }