Example #1
0
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();
	}
    }
}
Example #2
0
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;
	}
    }
}
Example #3
0
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;
	}
}