/** * pass_to_client() - forwards dhcp packets from server to client * p - packet to send */ static void pass_to_client(struct dhcp_packet *p, int packet_len, int *fds) { int type; struct xid_item *item; /* check xid */ item = xid_find(p->xid); if (!item) { return; } /* check packet type */ type = get_dhcp_packet_type(p); if (type != DHCPOFFER && type != DHCPACK && type != DHCPNAK) { return; } //TODO: also do it if (p->flags & htons(BROADCAST_FLAG)) is set! if (item->ip.sin_addr.s_addr == htonl(INADDR_ANY)) item->ip.sin_addr.s_addr = htonl(INADDR_BROADCAST); if (sendto_ip4(fds[item->client], p, packet_len, &item->ip) != 0) { return; /* send error occurred */ } /* remove xid entry */ xid_del(p->xid); }
/** * pass_back() - forwards dhcp packets from server to client * p - packet to send */ static void pass_back(struct dhcpMessage *p, int packet_len, int *fds) { int res, type; struct xid_item *item; /* check xid */ item = xid_find(p->xid); if (!item) { return; } /* check packet type */ type = get_dhcp_packet_type(p); if (type != DHCPOFFER && type != DHCPACK && type != DHCPNAK) { return; } if (item->ip.sin_addr.s_addr == htonl(INADDR_ANY)) item->ip.sin_addr.s_addr = htonl(INADDR_BROADCAST); if (item->client > MAX_INTERFACES) return; res = sendto(fds[item->client], p, packet_len, 0, (struct sockaddr*)(&item->ip), sizeof(item->ip)); if (res != packet_len) { bb_perror_msg("pass_back"); return; } /* remove xid entry */ xid_del(p->xid); }