add support for setting the dhcp vendor class option (option 60).
authorPaul Fox <pgf@brightstareng.com>
Thu, 22 Sep 2005 18:59:13 +0000 (18:59 -0000)
committerPaul Fox <pgf@brightstareng.com>
Thu, 22 Sep 2005 18:59:13 +0000 (18:59 -0000)
udhcpc now has a -V (--vendorclass), which will replace the default
"udhcpRELEASE" string in this option.

include/usage.h
networking/udhcp/README.udhcpc
networking/udhcp/clientpacket.c
networking/udhcp/dhcpc.c
networking/udhcp/dhcpc.h

index f702729e544b1dd866501a31fe02b1be39341c16..8b1a8d78519cd2b5f63fc8cfcf3d972758a793ed 100644 (file)
        "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" \
index e19bf37507ad114b4abc6e4363a3bc107807a035..0417ff2ab7c15234de34139cde16d121cb496ae8 100644 (file)
@@ -10,7 +10,9 @@ command line options
 
 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 2695b06ed38f0135d020e64b51da60646bf9bdba..528befde6238bc8cc976054da90031193842b910 100644 (file)
@@ -69,18 +69,13 @@ unsigned long random_xid(void)
 /* 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 35ae757e7baa3da8270872662b738dc13b8a2108..48923f69799e4ae302882bbc0f517c10914e972a 100644 (file)
@@ -66,6 +66,7 @@ struct client_config_t client_config = {
        .pidfile = NULL,
        .script = DEFAULT_SCRIPT,
        .clientid = NULL,
+       .vendorclass = NULL,
        .hostname = NULL,
        .fqdn = NULL,
        .ifindex = 0,
@@ -77,8 +78,9 @@ static void __attribute__ ((noreturn)) show_usage(void)
 {
        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 @@ int main(int argc, char *argv[])
        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 @@ int main(int argc, char *argv[])
        /* 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 @@ int main(int argc, char *argv[])
                        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 @@ int main(int argc, char *argv[])
                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 77c180944683663a5adb66eb215d9133ca57d7c0..4cc1c4cc1d7e181ba888c0e58595a2f0564f5824 100644 (file)
@@ -26,6 +26,7 @@ struct client_config_t {
        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 */