/* Fill options field, siaddr_nip, and sname and boot_file fields. * TODO: teach this code to use overload option. */ static void add_server_options(struct dhcp_packet *packet) { struct option_set *curr = server_config.options; while (curr) { if (curr->data[OPT_CODE] != DHCP_LEASE_TIME) udhcp_add_binary_option(packet, curr->data); curr = curr->next; } packet->siaddr_nip = server_config.siaddr_nip; if (server_config.sname) strncpy((char*)packet->sname, server_config.sname, sizeof(packet->sname) - 1); if (server_config.boot_file) strncpy((char*)packet->file, server_config.boot_file, sizeof(packet->file) - 1); }
/* Add an one to four byte option to a packet */ void FAST_FUNC udhcp_add_simple_option(struct dhcp_packet *packet, uint8_t code, uint32_t data) { const struct dhcp_optflag *dh; for (dh = dhcp_optflags; dh->code; dh++) { if (dh->code == code) { uint8_t option[6], len; option[OPT_CODE] = code; len = dhcp_option_lengths[dh->flags & OPTION_TYPE_MASK]; option[OPT_LEN] = len; if (BB_BIG_ENDIAN) data <<= 8 * (4 - len); /* Assignment is unaligned! */ move_to_unaligned32(&option[OPT_DATA], data); udhcp_add_binary_option(packet, option); return; } } bb_error_msg("can't add option 0x%02x", code); }