bd3a57b
diff -up dhcp-4.2.2/client/dhclient.c.gpxe-cid dhcp-4.2.2/client/dhclient.c
bd3a57b
--- dhcp-4.2.2/client/dhclient.c.gpxe-cid	2011-09-16 18:23:20.190453902 +0200
bd3a57b
+++ dhcp-4.2.2/client/dhclient.c	2011-09-16 18:27:15.568463599 +0200
bd3a57b
@@ -58,6 +58,13 @@ const char *path_dhclient_pid = NULL;
bd3a57b
 static char path_dhclient_script_array[] = _PATH_DHCLIENT_SCRIPT;
bd3a57b
 char *path_dhclient_script = path_dhclient_script_array;
bd3a57b
 
bd3a57b
+/* Default Prefix */
bd3a57b
+static unsigned char default_prefix[12] = {
bd3a57b
+	0xff, 0x00, 0x00, 0x00,
bd3a57b
+	0x00, 0x00, 0x02, 0x00,
bd3a57b
+	0x00, 0x02, 0xc9, 0x00
bd3a57b
+};
bd3a57b
+
bd3a57b
 /* False (default) => we write and use a pid file */
bd3a57b
 isc_boolean_t no_pid_file = ISC_FALSE;
bd3a57b
 
bd3a57b
@@ -1250,6 +1257,12 @@ int find_subnet (struct subnet **sp,
bd3a57b
 static void setup_ib_interface(struct interface_info *ip)
bd3a57b
 {
bd3a57b
 	struct group *g;
bd3a57b
+	struct hardware *hw = &ip->hw_address;
bd3a57b
+	char client_id[64];
bd3a57b
+	char *arg_conf = NULL;
bd3a57b
+	int arg_conf_len = 0;
bd3a57b
+	isc_result_t status;
bd3a57b
+	struct parse *cfile = (struct parse *)0;
bd3a57b
 
bd3a57b
 	/* Set the broadcast flag */
bd3a57b
 	ip->client->config->bootp_broadcast_always = 1;
bd3a57b
@@ -1266,8 +1279,39 @@ static void setup_ib_interface(struct in
bd3a57b
 		}
bd3a57b
 	}
bd3a57b
 
bd3a57b
-	/* No client ID specified */
bd3a57b
-	log_fatal("dhcp-client-identifier must be specified for InfiniBand");
bd3a57b
+	/*
bd3a57b
+	 * No client ID specified, make up one based on a default
bd3a57b
+	 * "prefix" and the port GUID.
bd3a57b
+	 *
bd3a57b
+	 * NOTE: This is compatible with what gpxe does.
bd3a57b
+	 */
bd3a57b
+	sprintf(client_id, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
bd3a57b
+		default_prefix[0], default_prefix[1], default_prefix[2],
bd3a57b
+		default_prefix[3], default_prefix[4], default_prefix[5],
bd3a57b
+		default_prefix[6], default_prefix[7], default_prefix[8],
bd3a57b
+		default_prefix[9], default_prefix[10], default_prefix[11],
bd3a57b
+		hw->hbuf[1], hw->hbuf[2], hw->hbuf[3], hw->hbuf[4],
bd3a57b
+		hw->hbuf[5], hw->hbuf[6], hw->hbuf[7], hw->hbuf[8]);
bd3a57b
+
bd3a57b
+	arg_conf_len = asprintf(&arg_conf,
bd3a57b
+				"send dhcp-client-identifier %s;",
bd3a57b
+				client_id);
bd3a57b
+
bd3a57b
+	if ((arg_conf == 0) || (arg_conf_len <= 0))
bd3a57b
+		log_fatal("Unable to send option dhcp-client-identifier");
bd3a57b
+
bd3a57b
+	status = new_parse(&cfile, -1, arg_conf, arg_conf_len,
bd3a57b
+			   "Automatic Infiniband client identifier", 0);
bd3a57b
+
bd3a57b
+	if ((status != ISC_R_SUCCESS) || (cfile->warnings_occurred))
bd3a57b
+		log_fatal("Failed to parse Infiniband client identifier");
bd3a57b
+
bd3a57b
+	parse_client_statement(cfile, NULL, ip->client->config);
bd3a57b
+
bd3a57b
+	if (cfile->warnings_occurred)
bd3a57b
+		log_fatal("Failed to parse Infiniband client identifier");
bd3a57b
+
bd3a57b
+	end_parse(&cfile);
bd3a57b
 }
bd3a57b
 
bd3a57b
 /* Individual States:
bd3a57b
diff -up dhcp-4.2.2/common/lpf.c.gpxe-cid dhcp-4.2.2/common/lpf.c
bd3a57b
--- dhcp-4.2.2/common/lpf.c.gpxe-cid	2011-09-16 18:23:20.183453996 +0200
bd3a57b
+++ dhcp-4.2.2/common/lpf.c	2011-09-16 18:25:28.235804421 +0200
47fd457
@@ -698,6 +698,7 @@ get_hw_addr(struct interface_info *info)
bd3a57b
 
bd3a57b
 			hw->hlen = 1;
bd3a57b
 			hw->hbuf[0] = HTYPE_INFINIBAND;
47fd457
+			memcpy(&hw->hbuf[1], &sll->sll_addr[sll->sll_halen - 8], 8);
bd3a57b
 			break;
bd3a57b
 #if defined(ARPHRD_PPP)
bd3a57b
 		case ARPHRD_PPP: