You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.5 KiB
72 lines
2.5 KiB
diff -up dhcp-4.2.2/client/dhclient.c.gpxe-cid dhcp-4.2.2/client/dhclient.c |
|
--- dhcp-4.2.2/client/dhclient.c.gpxe-cid 2011-09-16 18:23:20.190453902 +0200 |
|
+++ dhcp-4.2.2/client/dhclient.c 2011-09-16 18:27:15.568463599 +0200 |
|
@@ -58,6 +58,13 @@ const char *path_dhclient_pid = NULL; |
|
static char path_dhclient_script_array[] = _PATH_DHCLIENT_SCRIPT; |
|
char *path_dhclient_script = path_dhclient_script_array; |
|
|
|
+/* Default Prefix */ |
|
+static unsigned char default_prefix[12] = { |
|
+ 0xff, 0x00, 0x00, 0x00, |
|
+ 0x00, 0x00, 0x02, 0x00, |
|
+ 0x00, 0x02, 0xc9, 0x00 |
|
+}; |
|
+ |
|
/* False (default) => we write and use a pid file */ |
|
isc_boolean_t no_pid_file = ISC_FALSE; |
|
|
|
@@ -1250,6 +1257,12 @@ int find_subnet (struct subnet **sp, |
|
static void setup_ib_interface(struct interface_info *ip) |
|
{ |
|
struct group *g; |
|
+ struct hardware *hw = &ip->hw_address; |
|
+ char client_id[64]; |
|
+ char *arg_conf = NULL; |
|
+ int arg_conf_len = 0; |
|
+ isc_result_t status; |
|
+ struct parse *cfile = (struct parse *)0; |
|
|
|
/* Set the broadcast flag */ |
|
ip->client->config->bootp_broadcast_always = 1; |
|
@@ -1266,8 +1279,39 @@ static void setup_ib_interface(struct in |
|
} |
|
} |
|
|
|
- /* No client ID specified */ |
|
- log_fatal("dhcp-client-identifier must be specified for InfiniBand"); |
|
+ /* |
|
+ * No client ID specified, make up one based on a default |
|
+ * "prefix" and the port GUID. |
|
+ * |
|
+ * NOTE: This is compatible with what gpxe does. |
|
+ */ |
|
+ sprintf(client_id, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", |
|
+ default_prefix[0], default_prefix[1], default_prefix[2], |
|
+ default_prefix[3], default_prefix[4], default_prefix[5], |
|
+ default_prefix[6], default_prefix[7], default_prefix[8], |
|
+ default_prefix[9], default_prefix[10], default_prefix[11], |
|
+ hw->hbuf[1], hw->hbuf[2], hw->hbuf[3], hw->hbuf[4], |
|
+ hw->hbuf[5], hw->hbuf[6], hw->hbuf[7], hw->hbuf[8]); |
|
+ |
|
+ arg_conf_len = asprintf(&arg_conf, |
|
+ "send dhcp-client-identifier %s;", |
|
+ client_id); |
|
+ |
|
+ if ((arg_conf == 0) || (arg_conf_len <= 0)) |
|
+ log_fatal("Unable to send option dhcp-client-identifier"); |
|
+ |
|
+ status = new_parse(&cfile, -1, arg_conf, arg_conf_len, |
|
+ "Automatic Infiniband client identifier", 0); |
|
+ |
|
+ if ((status != ISC_R_SUCCESS) || (cfile->warnings_occurred)) |
|
+ log_fatal("Failed to parse Infiniband client identifier"); |
|
+ |
|
+ parse_client_statement(cfile, NULL, ip->client->config); |
|
+ |
|
+ if (cfile->warnings_occurred) |
|
+ log_fatal("Failed to parse Infiniband client identifier"); |
|
+ |
|
+ end_parse(&cfile); |
|
} |
|
|
|
/* Individual States:
|
|
|