void print_dhcp_pkt_all(void) { pxe_bootp_t *p; size_t len; int i; int ptype[3] = {PXENV_PACKET_TYPE_DHCP_DISCOVER, PXENV_PACKET_TYPE_DHCP_ACK, PXENV_PACKET_TYPE_CACHED_REPLY}; for (i = 0; i < 3; i++) { if (!pxe_get_cached_info(ptype[i], (void **)&(p), &(len))) { dprintf("Got packet #%d/%d\n", (i + 1), ptype[i]); print_pxe_bootp_t(p, len); pressanykey(); } } }
void mboot_solaris_dhcp_hack(void) { void *dhcpdata; size_t dhcplen; if (syslinux_derivative_info()->c.filesystem != SYSLINUX_FS_PXELINUX) return; if (!pxe_get_cached_info(PXENV_PACKET_TYPE_DHCP_ACK, &dhcpdata, &dhcplen)) { mbinfo.drives_addr = map_data(dhcpdata, dhcplen, 4, 0); if (mbinfo.drives_addr) { mbinfo.drives_length = dhcplen; mbinfo.boot_device = 0x20ffffff; mbinfo.flags = (mbinfo.flags & ~MB_INFO_DRIVE_INFO) | MB_INFO_BOOTDEV; } } }
void OS::get_hostname(void) { char *dhcpdata; size_t dhcplen; xassert(pxe_get_cached_info(PXENV_PACKET_TYPE_DHCP_ACK, (void **)&dhcpdata, &dhcplen) == 0); /* Save MyIP for later (in udp_open) */ ip.s_addr = ((pxe_bootp_t *)dhcpdata)->yip; memcpy(mac, ((pxe_bootp_t *)dhcpdata)->CAddr, sizeof(mac)); /* Skip standard fields, as hostname is an option */ unsigned offset = 4 + offsetof(pxe_bootp_t, vendor.d); while (offset < dhcplen) { int code = dhcpdata[offset]; int len = dhcpdata[offset + 1]; /* Sanity-check length */ if (len == 0) break; /* Skip non-hostname options */ if (code != 12) { offset += 2 + len; continue; } /* Sanity-check length */ if ((offset + len) > dhcplen) break; /* Create a private copy */ hostname = strndup(&dhcpdata[offset + 2], len); xassert(hostname); break; } }