Change udhcpc Vendor Class (not Client ID)?
Paul Fox
pgf at brightstareng.com
Wed Sep 21 17:04:59 UTC 2005
> > I'm sorry, that's what I meant. I'd like to change the vendor class
> > identifier. As you say, it's unfortunate that this hasn't been
> > included. Is there anyway for you, or someone else, to incorporate your
> > patches into busybox proper?
the attached patch seems to work, and implements "-V vendorclass"
in udhcpc. any objections?
i suspect that there's some code savings to be had in combining
some of the option creation code, but i didn't bother after i
found a free 288 bytes (when building just udhcpc without
udhcpd) by moving a couple of routines that udhcpc doesn't use
from common files to the "private" udhcpd side. i'll be
committing that separately.
=---------------------
paul fox, pgf at brightstareng.com
Index: networking/udhcp/clientpacket.c
===================================================================
--- networking/udhcp/clientpacket.c (revision 11511)
+++ networking/udhcp/clientpacket.c (working copy)
@@ -69,18 +69,13 @@
/* initialize a packet with the proper defaults */
static void init_packet(struct dhcpMessage *packet, char type)
{
- struct vendor {
- char vendor, length;
- char str[sizeof("udhcp "VERSION)];
- } vendor_id = { DHCP_VENDOR, sizeof("udhcp "VERSION) - 1, "udhcp "VERSION};
-
init_header(packet, type);
memcpy(packet->chaddr, client_config.arp, 6);
if (client_config.clientid)
add_option_string(packet->options, client_config.clientid);
if (client_config.hostname) add_option_string(packet->options, client_config.hostname);
if (client_config.fqdn) add_option_string(packet->options, client_config.fqdn);
- add_option_string(packet->options, (uint8_t *) &vendor_id);
+ add_option_string(packet->options, client_config.vendorclass);
}
Index: networking/udhcp/dhcpc.c
===================================================================
--- networking/udhcp/dhcpc.c (revision 11511)
+++ networking/udhcp/dhcpc.c (working copy)
@@ -66,6 +66,7 @@
.pidfile = NULL,
.script = DEFAULT_SCRIPT,
.clientid = NULL,
+ .vendorclass = NULL,
.hostname = NULL,
.fqdn = NULL,
.ifindex = 0,
@@ -77,8 +78,9 @@
{
printf(
"Usage: udhcpc [OPTIONS]\n\n"
-" -c, --clientid=CLIENTID Set client identifier\n"
+" -c, --clientid=CLIENTID Set client identifier - type is first char\n"
" -C, --clientid-none Suppress default client identifier\n"
+" -V, --vendorclass=CLASSID Set vendor class identifier\n"
" -H, --hostname=HOSTNAME Client hostname\n"
" -h Alias for -H\n"
" -F, --fqdn=FQDN Client fully qualified domain name\n"
@@ -199,6 +201,7 @@
static const struct option arg_options[] = {
{"clientid", required_argument, 0, 'c'},
{"clientid-none", no_argument, 0, 'C'},
+ {"vendorclass", required_argument, 0, 'V'},
{"foreground", no_argument, 0, 'f'},
{"background", no_argument, 0, 'b'},
{"hostname", required_argument, 0, 'H'},
@@ -217,7 +220,7 @@
/* get options */
while (1) {
int option_index = 0;
- c = getopt_long(argc, argv, "c:CfbH:h:F:i:np:qr:s:v", arg_options, &option_index);
+ c = getopt_long(argc, argv, "c:CV:fbH:h:F:i:np:qr:s:v", arg_options, &option_index);
if (c == -1) break;
switch (c) {
@@ -235,6 +238,14 @@
if (client_config.clientid) show_usage();
no_clientid = 1;
break;
+ case 'V':
+ len = strlen(optarg) > 255 ? 255 : strlen(optarg);
+ if (client_config.vendorclass) free(client_config.vendorclass);
+ client_config.vendorclass = xmalloc(len + 2);
+ client_config.vendorclass[OPT_CODE] = DHCP_VENDOR;
+ client_config.vendorclass[OPT_LEN] = len;
+ strncpy(client_config.vendorclass + OPT_DATA, optarg, len);
+ break;
case 'f':
client_config.foreground = 1;
break;
@@ -310,6 +321,16 @@
memcpy(client_config.clientid + 3, client_config.arp, 6);
}
+ if (!client_config.vendorclass) {
+ client_config.vendorclass = xmalloc(sizeof("udhcp "VERSION) + 2);
+ client_config.vendorclass[OPT_CODE] = DHCP_VENDOR;
+ client_config.vendorclass[OPT_LEN] = sizeof("udhcp "VERSION) - 1;
+ client_config.vendorclass[OPT_DATA] = 1;
+ memcpy(&client_config.vendorclass[OPT_DATA],
+ "udhcp "VERSION, sizeof("udhcp "VERSION) - 1);
+ }
+
+
/* setup the signal pipe */
udhcp_sp_setup();
Index: networking/udhcp/dhcpc.h
===================================================================
--- networking/udhcp/dhcpc.h (revision 11511)
+++ networking/udhcp/dhcpc.h (working copy)
@@ -26,6 +26,7 @@
char *pidfile; /* Optionally store the process ID */
char *script; /* User script to run at dhcp events */
uint8_t *clientid; /* Optional client id to use */
+ uint8_t *vendorclass; /* Optional vendor class-id to use */
uint8_t *hostname; /* Optional hostname to use */
uint8_t *fqdn; /* Optional fully qualified domain name to use */
int ifindex; /* Index number of the interface to use */
Index: networking/udhcp/README.udhcpc
===================================================================
--- networking/udhcp/README.udhcpc (revision 11511)
+++ networking/udhcp/README.udhcpc (working copy)
@@ -10,7 +10,9 @@
The command line options for the udhcp client are:
--c, --clientid=CLIENTID Client identifier
+-c, --clientid=CLIENTID Set client identifier. Type is first char.
+-C, --clientid-none Suppress default client identifier
+-V, --vendorclass=CLASSID Set vendor class identifier
-H, --hostname=HOSTNAME Client hostname
-h, Alias for -H
-F, --fqdn=FQDN Client fully qualified domain name
Index: include/usage.h
===================================================================
--- include/usage.h (revision 11511)
+++ include/usage.h (working copy)
@@ -2991,10 +2991,11 @@
"Adjust filesystem options on ext[23] filesystems.\n\n"
#define udhcpc_trivial_usage \
- "[-Cfbnqv] [-c CLIENTID] [-H HOSTNAME] [-i INTERFACE]\n[-p pidfile] [-r IP] [-s script]"
+ "[-Cfbnqv] [-c CID] [-V VCLS] [-H HOSTNAME] [-i INTERFACE]\n[-p pidfile] [-r IP] [-s script]"
#define udhcpc_full_usage \
"\t-c,\t--clientid=CLIENTID\tSet client identifier\n" \
"\t-C,\t--clientid-none\tSuppress default client identifier\n" \
+ "\t-V,\t--vendorclass=CLASSID\tSet vendor class identifier\n" \
"\t-H,\t--hostname=HOSTNAME\tClient hostname\n" \
"\t-h,\t \tAlias for -H\n" \
"\t-f,\t--foreground\tDo not fork after getting lease\n" \
More information about the busybox
mailing list