# This ISC dhcpd 3.x config snippet is inspired by initrd code in
# contrib area of etherboot source (dhcpd.conf.etherboot.include).

# Usage:
#
# include "/etc/local-COMMON/dhcp3/dhcpd.etherboot";
# include "/etc/local-COMMON/dhcp3/dhcpd.etherboot-udhcp";
# include "/etc/local/dhcpd.conf.etherboot-pcimap.include"; # file generated by mknbi-set
#
# (...common options...)
#
# subclass "etherboot-udhcp-hosts" 00:01:02:03:04:05;
# subclass "etherboot-udhcp-hosts" 00:01:02:03:04:06 { fixed-address 192.168.1.101; another-option "bla bla"; }
#

class "etherboot-udhcp-hosts" {
	match pick-first-value (option dhcp-client-identifier, hardware);
}

# Apply Etherboot options only for Etherboot clients
#
if substring ( option vendor-class-identifier, 0, 9 ) = "Etherboot" {

	# We must specify this value for etherboot-magic, or Etherboot will
	# ignore all other options.
	#
	option etherboot.magic E4:45:74:68:00:00;

	# Bootfile name: derive from etherboot.kmod (calculated below)
	# Use boot.nbi if no NIC_DEV_ID option present
	# (i.e. if etherboot.kmod doesn't get set)
	# Also pass filename back in filename field
	#
	option bootfile-name = pick-first-value (
		concat (
			"boot-",
			config-option etherboot.kmod,
			".nbi"
		),
		"boot.nbi"
	) ;
	filename = config-option bootfile-name;

	# "Sensible" default values for some options

	# Mount devfs (will probably be needed for a network-boot)
	option etherboot.kernel-cmdline " devfs=mount";

	# Info message (includes client IP address, MAC address, hardware ID string,
	# server IP address and name of boot file)
	option etherboot.motd-4 = concat (
		"Using Etherboot to boot ",
		binary-to-ascii ( 10, 8, ".", leased-address ),
		" [",
		binary-to-ascii ( 16, 8, ":", suffix ( hardware, 6 ) ),
		"] [",
		pick-first-value ( option etherboot.nic-dev-id, "unknown card" ),
		"]", 0d:0a, "  from ",
		binary-to-ascii ( 10, 8, ".", option dhcp-server-identifier ),
		" with file ",
		config-option tftp-server-name,
		":",
		config-option bootfile-name,
		" [",
		pick-first-value ( config-option etherboot.kmod, "unknown module" ),
		"]", 0d:0a
	);
}

# Some options should be set for both Etherboot and the udhcpc client
#
if (
	( substring ( option vendor-class-identifier, 0, 9 ) = "Etherboot" )
        or
	( substring ( option vendor-class-identifier, 0, 5 ) = "udhcp" )
) {

	# TFTP server defaults to DHCP server and is specified in both
	# next-server field and tftp-server-name option field
	#
	option tftp-server-name = binary-to-ascii ( 10, 8, ".", config-option dhcp-server-identifier );
	server-name = config-option tftp-server-name;
	next-server = config-option dhcp-server-identifier;

	# Root path defaults to root of TFTP server
	option root-path = concat ( config-option tftp-server-name, ":/" );

	# A fallback hostname, generated from the IP address
	option host-name = concat ( "client_", binary-to-ascii ( 10, 8, "_", leased-address ) );
}

# Force some items onto parameter request list for udhcp
#
if substring ( option vendor-class-identifier, 0, 5 ) = "udhcp" {
	# Forcibly add root-path to list
	option dhcp-parameter-request-list = concat ( option dhcp-parameter-request-list, 11 );
}