]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Remove hard coded DHCP/DHCPv6 options and then to dhcpcd-definitions.conf
authorRoy Marples <roy@marples.name>
Mon, 2 Dec 2013 16:42:09 +0000 (16:42 +0000)
committerRoy Marples <roy@marples.name>
Mon, 2 Dec 2013 16:42:09 +0000 (16:42 +0000)
This file replaces dhcpcd-embedded.conf
This actually results in a slightly smaller binary than before and has the
added advantage that the option definitions are now all held within one file.

15 files changed:
Makefile
README
configure
dhcp-common.c
dhcp-common.h
dhcp.c
dhcp.h
dhcp6.c
dhcp6.h
dhcpcd-definitions.conf [new file with mode: 0644]
dhcpcd-embedded.conf [deleted file]
dhcpcd.c
genembedc
genembedh
if-options.c

index 953fd4cf7b05188be89db68364803e7e32fda9f4..86c07bf5514beb3c250768e4bd733866d9373a9e 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -77,10 +77,10 @@ dev:
 
 CLEANFILES+=   dhcpcd-embedded.h dhcpcd-embedded.c
 
-dhcpcd-embedded.h: genembedh dhcpcd-embedded.conf dhcpcd-embedded.h.in
+dhcpcd-embedded.h: genembedh dhcpcd-definitions.conf dhcpcd-embedded.h.in
        ${HOST_SH} ${.ALLSRC} $^ > $@
 
-dhcpcd-embedded.c: genembedc dhcpcd-embedded.conf
+dhcpcd-embedded.c: genembedc dhcpcd-definitions.conf
        ${HOST_SH} ${.ALLSRC} $^ > $@
 
 if-options.c: dhcpcd-embedded.h
@@ -93,9 +93,9 @@ depend: .depend
 ${PROG}: ${DEPEND} ${OBJS}
        ${CC} ${LDFLAGS} -o $@ ${OBJS} ${LDADD}
 
-_embeddedinstall: dhcpcd-embedded.conf
+_embeddedinstall: dhcpcd-definitions.conf
        ${INSTALL} -d ${DESTDIR}${SCRIPTSDIR}
-       ${INSTALL} -m ${CONFMODE} dhcpcd-embedded.conf ${DESTDIR}${SCRIPTSDIR}
+       ${INSTALL} -m ${CONFMODE} dhcpcd-definitions.conf ${DESTDIR}${SCRIPTSDIR}
 
 _proginstall: ${PROG}
        ${INSTALL} -d ${DESTDIR}${SBINDIR}
@@ -135,7 +135,7 @@ dist:
 import: ${SRCS}
        rm -rf /tmp/${DISTPREFIX}
        ${INSTALL} -d /tmp/${DISTPREFIX}
-       cp ${SRCS} dhcpcd.conf dhcpcd-embedded.conf *.in /tmp/${DISTPREFIX}
+       cp ${SRCS} dhcpcd.conf dhcpcd-definitions.conf *.in /tmp/${DISTPREFIX}
        cp $$(${CC} ${CPPFLAGS} -MM ${SRCS} | \
                sed -e 's/^.*\.c //g' -e 's/.*\.c$$//g' -e 's/\\//g' | \
                tr ' ' '\n' | \
@@ -190,7 +190,7 @@ import: ${SRCS}
                for x in \
                    /tmp/${DISTPREFIX}/dhcpcd-run-hooks.in \
                    /tmp/${DISTPREFIX}/dhcpcd.conf \
-                   /tmp/${DISTPREFIX}/dhcpcd-embedded.conf \
+                   /tmp/${DISTPREFIX}/dhcpcd-definitions.conf \
                ; do \
                        if test -e "$$x"; then \
                                if test "$$(sed -ne 1p $$x)" = "#!/bin/sh" \
diff --git a/README b/README
index 90f33c9a6b18dca482b3ba65906e518789b45ba0..3580c0a3c291a101fca628dd0c8940f5607c1724 100644 (file)
--- a/README
+++ b/README
@@ -57,10 +57,11 @@ To shrink dhcpcd you can disable IPv4 or IPv6:
        --disable-inet6
 
 You can also move the embedded extended configuration from the dhcpcd binary
-to an external file (LIBEXECDIR/dhcpcd-embedded.conf)
+to an external file (LIBEXECDIR/dhcpcd-definitions.conf)
        --disable-embedded
 If dhcpcd cannot load this file at runtime, dhcpcd will work but will not be
-able to decode any DHCP/DHCPv6 options present within the file.
+able to decode any DHCP/DHCPv6 options that are not defined by the user
+in /etc/dhcpcd.conf.
 
 To prepare dhcpcd for import into a platform source tree (like NetBSD)
 you can use the make import target to create /tmp/dhcpcd-$version and
index 6bb4290ce70f11ce449c602cb9cf853106f94761..bef44ad23bfca8efb5a72f1f541123bebb8908a4 100755 (executable)
--- a/configure
+++ b/configure
@@ -318,11 +318,11 @@ EOF
 fi
 
 if [ -z "$EMBEDDED" -o "$EMBEDDED" = yes ]; then
-       echo "dhcpcd-embedded.conf will be embedded in dhcpcd itself"
+       echo "dhcpcd-definitions.conf will be embedded in dhcpcd itself"
        echo "SRCS+=            dhcpcd-embedded.c" >>$CONFIG_MK
 else
-       echo "dhcpcd-embedded.conf will be installed to $LIBEXECDIR"
-       echo "CFLAGS+= -DEMBEDDED_CONFIG=\\\"$LIBEXECDIR/dhcpcd-embedded.conf\\\"" >>$CONFIG_MK
+       echo "dhcpcd-definitions.conf will be installed to $LIBEXECDIR"
+       echo "CFLAGS+= -DEMBEDDED_CONFIG=\\\"$LIBEXECDIR/dhcpcd-definitions.conf\\\"" >>$CONFIG_MK
        echo "EMBEDDEDINSTALL=  _embeddedinstall" >>$CONFIG_MK
 fi
 
index 694949bbcd8c22c2aa605b090d87155413b13a6a..5e07475eaa6f03e4e13ef34cf8716f4537bd81fb 100644 (file)
@@ -47,12 +47,13 @@ struct dhcp_opt *dhcp6_override = NULL;
 size_t dhcp6_override_len = 0;
 #endif
 
-int make_option_mask(const struct dhcp_opt *dopts,
+int make_option_mask(const struct dhcp_opt *dopts, size_t dopts_len,
     uint8_t *mask, const char *opts, int add)
 {
        char *token, *o, *p, *t;
        const struct dhcp_opt *opt;
        int match, n;
+       size_t i;
 
        o = p = strdup(opts);
        if (opts == NULL)
@@ -60,9 +61,7 @@ int make_option_mask(const struct dhcp_opt *dopts,
        while ((token = strsep(&p, ", "))) {
                if (*token == '\0')
                        continue;
-               for (opt = dopts; opt->option; opt++) {
-                       if (!opt->v.var)
-                               continue;
+               for (i = 0, opt = dopts; i < dopts_len; i++, opt++) {
                        match = 0;
                        if (strcmp(opt->v.var, token) == 0)
                                match = 1;
index eca79e61d88f8956257889813ee4c86fd8197420..26247978c5bd27c81c26e916e54ad9cb468221d0 100644 (file)
@@ -87,7 +87,8 @@ struct dhcp_opt {
 #define add_option_mask(var, val) (var[val >> 3] |= 1 << (val & 7))
 #define del_option_mask(var, val) (var[val >> 3] &= ~(1 << (val & 7)))
 #define has_option_mask(var, val) (var[val >>3] & (1 << (val & 7)))
-int make_option_mask(const struct dhcp_opt *, uint8_t *, const char *, int);
+int make_option_mask(const struct dhcp_opt *, size_t,
+    uint8_t *, const char *, int);
 
 size_t encode_rfc1035(const char *src, uint8_t *dst);
 ssize_t decode_rfc3397(char *, ssize_t, int, const uint8_t *);
diff --git a/dhcp.c b/dhcp.c
index 814c8bdd16584fc3387dc64ade7cb319628f9ee5..bca2a5404920ea42c332292fa4169dc42136da06 100644 (file)
--- a/dhcp.c
+++ b/dhcp.c
@@ -104,109 +104,6 @@ static const struct dhcp_op dhcp_ops[] = {
        { 0, NULL }
 };
 
-#define O(a, b, c) {.option = (a), .type = (b), .v.var = (c) }
-const struct dhcp_opt dhcp_opts[] = {
-       O(1,    ADDRIPV4 | REQUEST,     "subnet_mask"),
-               /* RFC 3442 states that the CSR has to come before all other
-                * routes. For completeness, we also specify static routes,
-                * then routers. */
-       O(121,  RFC3442,        "classless_static_routes"),
-       O(249,  RFC3442,        "ms_classless_static_routes"),
-       O(33,   IPV4A | REQUEST,        "static_routes"),
-       O(3,    IPV4A | REQUEST,        "routers"),
-       O(2,    UINT32,         "time_offset"),
-       O(4,    IPV4A,          "time_servers"),
-       O(5,    IPV4A,          "ien116_name_servers"),
-       O(6,    IPV4A,          "domain_name_servers"),
-       O(7,    IPV4A,          "log_servers"),
-       O(8,    IPV4A,          "cookie_servers"),
-       O(9,    IPV4A,          "lpr_servers"),
-       O(10,   IPV4A,          "impress_servers"),
-       O(11,   IPV4A,          "resource_location_servers"),
-       O(12,   STRING,         "host_name"),
-       O(13,   UINT16,         "boot_size"),
-       O(14,   STRING,         "merit_dump"),
-       O(15,   STRING,         "domain_name"),
-       O(16,   ADDRIPV4,       "swap_server"),
-       O(17,   STRING,         "root_path"),
-       O(18,   STRING,         "extensions_path"),
-       O(19,   UINT8,          "ip_forwarding"),
-       O(20,   UINT8,          "non_local_source_routing"),
-       O(21,   IPV4A,  "policy_filter"),
-       O(22,   SINT16,         "max_dgram_reassembly"),
-       O(23,   UINT16,         "default_ip_ttl"),
-       O(24,   UINT32,         "path_mtu_aging_timeout"),
-       O(25,   UINT16 | ARRAY, "path_mtu_plateau_table"),
-       O(26,   UINT16,         "interface_mtu"),
-       O(27,   UINT8,          "all_subnets_local"),
-       O(28,   ADDRIPV4 | REQUEST,     "broadcast_address"),
-       O(29,   UINT8,          "perform_mask_discovery"),
-       O(30,   UINT8,          "mask_supplier"),
-       O(31,   UINT8,          "router_discovery"),
-       O(32,   ADDRIPV4,       "router_solicitation_address"),
-       O(34,   UINT8,          "trailer_encapsulation"),
-       O(35,   UINT32,         "arp_cache_timeout"),
-       O(36,   UINT16,         "ieee802_3_encapsulation"),
-       O(37,   UINT8,          "default_tcp_ttl"),
-       O(38,   UINT32,         "tcp_keepalive_interval"),
-       O(39,   UINT8,          "tcp_keepalive_garbage"),
-       O(40,   STRING,         "nis_domain"),
-       O(41,   IPV4A,          "nis_servers"),
-       O(42,   IPV4A,          "ntp_servers"),
-       O(43,   STRING,         "vendor_encapsulated_options"),
-       O(44,   IPV4A,          "netbios_name_servers"),
-       O(45,   ADDRIPV4,       "netbios_dd_server"),
-       O(46,   UINT8,          "netbios_node_type"),
-       O(47,   STRING,         "netbios_scope"),
-       O(48,   IPV4A,          "font_servers"),
-       O(49,   IPV4A,          "x_display_manager"),
-       O(50,   ADDRIPV4,       "dhcp_requested_address"),
-       O(51,   UINT32 | REQUEST,       "dhcp_lease_time"),
-       O(52,   UINT8,          "dhcp_option_overload"),
-       O(53,   UINT8,          "dhcp_message_type"),
-       O(54,   ADDRIPV4,       "dhcp_server_identifier"),
-       O(55,   UINT8 | ARRAY,  "dhcp_parameter_request_list"),
-       O(56,   STRING,         "dhcp_message"),
-       O(57,   UINT16,         "dhcp_max_message_size"),
-       O(58,   UINT32 | REQUEST,       "dhcp_renewal_time"),
-       O(59,   UINT32 | REQUEST,       "dhcp_rebinding_time"),
-       O(64,   STRING,         "nisplus_domain"),
-       O(65,   IPV4A,          "nisplus_servers"),
-       O(66,   STRING,         "tftp_server_name"),
-       O(67,   STRING,         "bootfile_name"),
-       O(68,   IPV4A,          "mobile_ip_home_agent"),
-       O(69,   IPV4A,          "smtp_server"),
-       O(70,   IPV4A,          "pop_server"),
-       O(71,   IPV4A,          "nntp_server"),
-       O(72,   IPV4A,          "www_server"),
-       O(73,   IPV4A,          "finger_server"),
-       O(74,   IPV4A,          "irc_server"),
-       O(75,   IPV4A,          "streettalk_server"),
-       O(76,   IPV4A,          "streettalk_directory_assistance_server"),
-       O(77,   STRING,         "user_class"),
-       O(80,   FLAG | NOREQ,   "rapid_commit"),
-       O(81,   STRING | RFC3397,       "fqdn"),
-       O(85,   IPV4A,          "nds_servers"),
-       O(86,   STRING,         "nds_tree_name"),
-       O(87,   STRING,         "nds_context"),
-       O(88,   STRING | RFC3397,       "bcms_controller_names"),
-       O(89,   IPV4A,          "bcms_controller_address"),
-       O(91,   UINT32,         "client_last_transaction_time"),
-       O(92,   IPV4A,          "associated_ip"),
-       O(98,   STRING,         "uap_servers"),
-       O(100,  STRING,         "posix_timezone"),
-       O(101,  STRING,         "tzdb_timezone"),
-       O(112,  IPV4A,          "netinfo_server_address"),
-       O(113,  STRING,         "netinfo_server_tag"),
-       O(114,  STRING,         "default_url"),
-       O(118,  ADDRIPV4,       "subnet_selection"),
-       O(119,  STRING | RFC3397,       "domain_search"),
-       O(120,  STRING | RFC3361,       "sip_server"),
-       O(212,  RFC5969,        "sixrd"),
-       O(0, 0, NULL)
-};
-#undef O
-
 static const char *dhcp_params[] = {
        "ip_address",
        "subnet_cidr",
@@ -223,8 +120,8 @@ struct udp_dhcp_packet
        struct dhcp_message dhcp;
 };
 
-struct dhcp_opt *dhcp_eopts = NULL;
-size_t dhcp_eopts_len = 0;
+struct dhcp_opt *dhcp_opts = NULL;
+size_t dhcp_opts_len = 0;
 
 static const size_t udp_dhcp_len = sizeof(struct udp_dhcp_packet);
 
@@ -233,15 +130,15 @@ static int dhcp_open(struct interface *);
 void
 dhcp_printoptions(void)
 {
-       const struct dhcp_opt *opt;
        const char **p;
+       size_t i;
+       const struct dhcp_opt *opt;
 
        for (p = dhcp_params; *p; p++)
                printf("    %s\n", *p);
 
-       for (opt = dhcp_opts; opt->option; opt++)
-               if (opt->v.var)
-                       printf("%03d %s\n", opt->option, opt->v.var);
+       for (i = 0, opt = dhcp_opts; i < dhcp_opts_len; i++, opt++)
+               printf("%03d %s\n", opt->option, opt->v.var);
 }
 
 #ifdef DEBUG_MEMORY
@@ -780,7 +677,7 @@ make_message(struct dhcp_message **message,
        uint8_t *n_params = NULL;
        uint32_t ul;
        uint16_t sz;
-       size_t len;
+       size_t len, i;
        const struct dhcp_opt *opt;
        const struct if_options *ifo = iface->options;
        const struct dhcp_state *state = D_CSTATE(iface);
@@ -970,7 +867,7 @@ make_message(struct dhcp_message **message,
                *p++ = DHO_PARAMETERREQUESTLIST;
                n_params = p;
                *p++ = 0;
-               for (opt = dhcp_opts; opt->option; opt++) {
+               for (i = 0, opt = dhcp_opts; i < dhcp_opts_len; i++, opt++) {
                        if (!(opt->type & REQUEST ||
                                has_option_mask(ifo->requestmask, opt->option)))
                                continue;
@@ -1072,7 +969,7 @@ read_lease(const struct interface *ifp)
 }
 
 static const struct dhcp_opt *
-dhcp_getoverride(const struct if_options *ifo, uint16_t o, int e)
+dhcp_getoverride(const struct if_options *ifo, uint16_t o)
 {
        size_t i;
        const struct dhcp_opt *opt;
@@ -1084,15 +981,6 @@ dhcp_getoverride(const struct if_options *ifo, uint16_t o, int e)
                if (opt->option == o)
                        return opt;
        }
-       if (e) {
-               for (i = 0, opt = dhcp_eopts;
-                   i < dhcp_eopts_len;
-                   i++, opt++)
-               {
-                       if (opt->option == o)
-                               return opt;
-               }
-       }
        return NULL;
 }
 
@@ -1137,32 +1025,19 @@ dhcp_env(char **env, const char *prefix, const struct dhcp_message *dhcp,
        get_option_uint8(&overl, dhcp, DHO_OPTIONSOVERLOADED);
 
        if (!env) {
-               for (opt = dhcp_opts; opt->option; opt++) {
-                       if (!opt->v.var)
-                               continue;
-                       if (has_option_mask(ifo->nomask, opt->option))
-                               continue;
-                       if (dhcp_getoverride(ifo, opt->option, 1))
-                               continue;
-                       p = get_option(dhcp, opt->option, &pl);
-                       if (!p)
-                               continue;
-                       e += dhcp_envoption(NULL, prefix, "", ifp->name,
-                           opt, dhcp_getoption, p, pl);
-               }
                if (dhcp->yiaddr || dhcp->ciaddr)
                        e += 5;
                if (*dhcp->bootfile && !(overl & 1))
                        e++;
                if (*dhcp->servername && !(overl & 2))
                        e++;
-               for (oi = 0, opt = dhcp_eopts;
-                   oi < dhcp_eopts_len;
+               for (oi = 0, opt = dhcp_opts;
+                   oi < dhcp_opts_len;
                    oi++, opt++)
                {
                        if (has_option_mask(ifo->nomask, opt->option))
                                continue;
-                       if (dhcp_getoverride(ifo, opt->option, 0))
+                       if (dhcp_getoverride(ifo, opt->option))
                                continue;
                        p = get_option(dhcp, opt->option, &pl);
                        if (!p)
@@ -1199,7 +1074,8 @@ dhcp_env(char **env, const char *prefix, const struct dhcp_message *dhcp,
                setvar(&ep, prefix, "subnet_cidr", cidr);
                if (get_option_addr(&brd, dhcp, DHO_BROADCAST) == -1) {
                        brd.s_addr = addr.s_addr | ~net.s_addr;
-                       setvar(&ep, prefix, "broadcast_address", inet_ntoa(brd));
+                       setvar(&ep, prefix, "broadcast_address",
+                           inet_ntoa(brd));
                }
                addr.s_addr = dhcp->yiaddr & net.s_addr;
                setvar(&ep, prefix, "network_number", inet_ntoa(addr));
@@ -1208,35 +1084,16 @@ dhcp_env(char **env, const char *prefix, const struct dhcp_message *dhcp,
        if (*dhcp->bootfile && !(overl & 1))
                setvar(&ep, prefix, "filename", (const char *)dhcp->bootfile);
        if (*dhcp->servername && !(overl & 2))
-               setvar(&ep, prefix, "server_name", (const char *)dhcp->servername);
-
-       for (opt = dhcp_opts; opt->option; opt++) {
-               if (!opt->v.var)
-                       continue;
-               if (has_option_mask(ifo->nomask, opt->option))
-                       continue;
-               if (dhcp_getoverride(ifo, opt->option, 1))
-                       continue;
-               p = get_option(dhcp, opt->option, &pl);
-               if (!p)
-                       continue;
-               /* No override, which means it's not embedded, so just
-                * grab the FQDN itself */
-               if (opt->option == DHO_FQDN) {
-                       p += 3;
-                       pl -= 3;
-               }
-               ep += dhcp_envoption(ep, prefix, "", ifp->name,
-                   opt, dhcp_getoption, p, pl);
-       }
+               setvar(&ep, prefix, "server_name",
+                   (const char *)dhcp->servername);
 
-       for (oi = 0, opt = dhcp_eopts;
-           oi < dhcp_eopts_len;
+       for (oi = 0, opt = dhcp_opts;
+           oi < dhcp_opts_len;
            oi++, opt++)
        {
                if (has_option_mask(ifo->nomask, opt->option))
                        continue;
-               if (dhcp_getoverride(ifo, opt->option, 0))
+               if (dhcp_getoverride(ifo, opt->option))
                        continue;
                if ((p = get_option(dhcp, opt->option, &pl)))
                        ep += dhcp_envoption(ep, prefix, "", ifp->name,
diff --git a/dhcp.h b/dhcp.h
index aeda65a878b8f198fcd61120f3204234c12af44d..8f17c814624f9f2429c11fa10e35336ec7b5ad06 100644 (file)
--- a/dhcp.h
+++ b/dhcp.h
@@ -238,10 +238,8 @@ struct dhcp_state {
 #include "net.h"
 
 #ifdef INET
-extern const struct dhcp_opt dhcp_opts[];
-
-extern struct dhcp_opt *dhcp_eopts;
-extern size_t dhcp_eopts_len;
+extern struct dhcp_opt *dhcp_opts;
+extern size_t dhcp_opts_len;
 
 char *decode_rfc3361(int dl, const uint8_t *data);
 ssize_t decode_rfc3442(char *out, ssize_t len, int pl, const uint8_t *p);
diff --git a/dhcp6.c b/dhcp6.c
index 259534e1c5816fe07606d8ced15589fc3003bd18..00a60a309e70b5ca01b71aa53d0ad1338b665dba 100644 (file)
--- a/dhcp6.c
+++ b/dhcp6.c
@@ -100,37 +100,8 @@ static const struct dhcp6_op dhcp6_ops[] = {
        { 0, NULL }
 };
 
-#define IPV6A  ADDRIPV6 | ARRAY
-#define O(a, b, c) {.option = (a), .type = (b), .v.var = (c) }
-const struct dhcp_opt dhcp6_opts[] = {
-       O(D6_OPTION_CLIENTID,           BINHEX,         "client_id"),
-       O(D6_OPTION_SERVERID,           BINHEX,         "server_id"),
-       O(D6_OPTION_IA_ADDR,            IPV6A,          "ia_addr"),
-       O(D6_OPTION_PREFERENCE,         UINT8,          "preference"),
-       O(D6_OPTION_UNICAST,            ADDRIPV6,       "unicast"),
-       O(D6_OPTION_RAPID_COMMIT,       FLAG | NOREQ,   "rapid_commit"),
-       O(D6_OPTION_STATUS_CODE,        SCODE,          "status_code"),
-       O(D6_OPTION_SIP_SERVERS_NAME,   RFC3397,        "sip_servers_names"),
-       O(D6_OPTION_SIP_SERVERS_ADDRESS,IPV6A,  "sip_servers_addresses"),
-       O(D6_OPTION_DNS_SERVERS,        IPV6A,          "name_servers"),
-       O(D6_OPTION_DOMAIN_LIST,        RFC3397,        "domain_search"),
-       O(D6_OPTION_NIS_SERVERS,        IPV6A,          "nis_servers"),
-       O(D6_OPTION_NISP_SERVERS,       IPV6A,          "nisp_servers"),
-       O(D6_OPTION_NIS_DOMAIN_NAME,    RFC3397,        "nis_domain_name"),
-       O(D6_OPTION_NISP_DOMAIN_NAME,   RFC3397,        "nisp_domain_name"),
-       O(D6_OPTION_SNTP_SERVERS,       IPV6A,          "sntp_servers"),
-       O(D6_OPTION_INFO_REFRESH_TIME,  UINT32,         "info_refresh_time"),
-       O(D6_OPTION_BCMS_SERVER_D,      RFC3397,        "bcms_server_d"),
-       O(D6_OPTION_BCMS_SERVER_A,      IPV6A,          "bcms_server_a"),
-       O(D6_OPTION_FQDN,               RFC3397,        "fqdn"),
-       O(D6_OPTION_POSIX_TIMEZONE,     STRING,         "posix_timezone"),
-       O(D6_OPTION_TZDB_TIMEZONE,      STRING,         "tzdb_timezone"),
-       O(0, 0, NULL)
-};
-#undef O
-
-struct dhcp_opt *dhcp6_eopts = NULL;
-size_t dhcp6_eopts_len = 0;
+struct dhcp_opt *dhcp6_opts = NULL;
+size_t dhcp6_opts_len = 0;
 
 struct dhcp_compat {
        uint8_t dhcp_opt;
@@ -2574,7 +2545,7 @@ dhcp6_handleifa(int cmd, const char *ifname,
 }
 
 static const struct dhcp_opt *
-dhcp6_getoverride(const struct if_options *ifo, uint16_t o, int e)
+dhcp6_getoverride(const struct if_options *ifo, uint16_t o)
 {
        size_t i;
        const struct dhcp_opt *opt;
@@ -2586,15 +2557,6 @@ dhcp6_getoverride(const struct if_options *ifo, uint16_t o, int e)
                if (opt->option == o)
                        return opt;
        }
-       if (e != 0) {
-               for (i = 0, opt = dhcp6_eopts;
-                   i < dhcp6_eopts_len;
-                   i++, opt++)
-               {
-                       if (opt->option == o)
-                               return opt;
-               }
-       }
        return NULL;
 }
 
@@ -2616,24 +2578,21 @@ dhcp6_env(char **env, const char *prefix, const struct interface *ifp,
        n = 0;
        ep = env;
        ifo = ifp->options;
-       for (opt = dhcp6_opts; opt->option; opt++) {
-               if (!opt->v.var)
-                       continue;
-               if (has_option_mask(ifo->nomask6, opt->option))
+
+       for (oi = 0, opt = dhcp6_opts;
+           oi < dhcp6_opts_len;
+           oi++, opt++)
+       {
+               if (has_option_mask(ifo->nomask, opt->option))
                        continue;
-               if (dhcp6_getoverride(ifo, opt->option, 1))
+               if (dhcp6_getoverride(ifo, opt->option))
                        continue;
+
                o = dhcp6_getmoption(opt->option, m, mlen);
                if (o == NULL)
                        continue;
                ol = ntohs(o->len);
                od = D6_COPTION_DATA(o);
-               /* No override, which means it's not embedded, so just
-                * grab the FQDN itself */
-               if (opt->option == D6_OPTION_FQDN) {
-                       ol--;
-                       od++;
-               }
                n += dhcp_envoption(env == NULL ? NULL : &env[n],
                    prefix, "_dhcp6", ifp->name, opt, dhcp6_getoption, od, ol);
        }
@@ -2684,24 +2643,6 @@ dhcp6_env(char **env, const char *prefix, const struct interface *ifp,
                }
        }
 
-       for (oi = 0, opt = dhcp6_eopts;
-           oi < dhcp6_eopts_len;
-           oi++, opt++)
-       {
-               if (has_option_mask(ifo->nomask, opt->option))
-                       continue;
-               if (dhcp6_getoverride(ifo, opt->option, 0))
-                       continue;
-
-               o = dhcp6_getmoption(opt->option, m, mlen);
-               if (o == NULL)
-                       continue;
-               ol = ntohs(o->len);
-               od = D6_COPTION_DATA(o);
-               n += dhcp_envoption(env == NULL ? NULL : &env[n],
-                   prefix, "_dhcp6", ifp->name, opt, dhcp6_getoption, od, ol);
-       }
-
        for (oi = 0, opt = ifo->dhcp6_override;
            oi < ifo->dhcp6_override_len;
            oi++, opt++)
diff --git a/dhcp6.h b/dhcp6.h
index 490d44be30dd9444e3d1bb8568978b8257cd5ce0..737e705c778936d4886e5a110805202741f706da 100644 (file)
--- a/dhcp6.h
+++ b/dhcp6.h
@@ -89,7 +89,6 @@
 
 #include "dhcp.h"
 #include "ipv6.h"
-extern const struct dhcp_opt dhcp6_opts[];
 
 struct dhcp6_message {
        uint8_t type;
@@ -222,8 +221,8 @@ struct dhcp6_state {
     ((const uint8_t *)(o) + sizeof(struct dhcp6_option))
 
 #ifdef INET6
-extern struct dhcp_opt *dhcp6_eopts;
-extern size_t dhcp6_eopts_len;
+extern struct dhcp_opt *dhcp6_opts;
+extern size_t dhcp6_opts_len;
 
 void dhcp6_printoptions(void);
 int dhcp6_addrexists(const struct ipv6_addr *);
diff --git a/dhcpcd-definitions.conf b/dhcpcd-definitions.conf
new file mode 100644 (file)
index 0000000..7320940
--- /dev/null
@@ -0,0 +1,233 @@
+# DHCP option definitions for dhcpcd(8)
+# These are used to translate DHCP options into shell variables
+# for use in dhcpcd-run-hooks(8)
+# See dhcpcd.conf(5) for details
+
+##############################################################################
+# DHCP RFC2132 options unless otheriwse stated
+define 1       request ipaddress       subnet_mask
+# RFC3442 states that the CSR has to come before all other routes
+# For completeness we also specify static routes then routers
+define 121     rfc3442                 classless_static_routes
+define 249     rfc3442                 ms_classless_static_routes
+define 33      request array ipaddress static_routes
+define 3       request array ipaddress routers
+define 2       uint32                  time_offset
+define 4       array ipaddress         time_servers
+define 5       array ipaddress         ien116_name_servers
+define 6       array ipaddress         domain_name_servers
+define 7       array ipaddress         log_servers
+define 8       array ipaddress         cookie_servers
+define 9       array ipaddress         lpr_servers
+define 10      array ipaddress         impress_servers
+define 11      array ipaddress         resource_location_servers
+define 12      string                  host_name
+define 13      uint16                  boot_size
+define 14      string                  merit_dump
+define 15      string                  domain_name
+define 16      ipaddress               swap_server
+define 17      string                  root_path
+define 18      string                  extensions_path
+define 19      byte                    ip_forwarding
+define 20      byte                    non_local_source_routing
+define 21      array ipaddress         policy_filter
+define 22      int16                   max_dgram_reassembly
+define 23      uint16                  default_ip_ttl
+define 24      uint32                  path_mtu_aging_timeout
+define 25      array uint16            path_mtu_plateau_table
+define 26      uint16                  interface_mtu
+define 27      byte                    all_subnets_local
+define 28      request ipaddress       broadcast_address
+define 29      byte                    perform_mask_discovery
+define 30      byte                    mask_supplier
+define 31      byte                    router_discovery
+define 32      ipaddress               router_solicitation_address
+define 34      byte                    trailer_encapsulation
+define 35      uint32                  arp_cache_timeout
+define 36      uint16                  ieee802_3_encapsulation
+define 37      byte                    default_tcp_ttl
+define 38      uint32                  tcp_keepalive_interval
+define 39      byte                    tcp_keepalive_garbage
+define 40      string                  nis_domain
+define 41      array ipaddress         nis_servers
+define 42      array ipaddress         ntp_servers
+define 43      string                  vendor_encapsulated_options
+define 44      array ipaddress         netbios_name_servers
+define 45      ipaddress               netbios_dd_server
+define 46      byte                    netbios_node_type
+define 47      string                  netbios_scope
+define 48      array ipaddress         font_servers
+define 49      array ipaddress         x_display_manager
+define 50      ipaddress               dhcp_requested_address
+define 51      request uint32          dhcp_lease_time
+define 52      byte                    dhcp_option_overload
+define 53      byte                    dhcp_message_type
+define 54      ipaddress               dhcp_server_identifier
+define 55      array byte              dhcp_parameter_request_list
+define 56      string                  dhcp_message
+define 57      uint16                  dhcp_max_message_size
+define 58      request uint32          dhcp_renewal_time
+define 59      request uint32          dhcp_rebinding_time
+define 64      string                  nisplus_domain
+define 65      array ipaddress         nisplus_servers
+define 66      string                  tftp_server_name
+define 67      string                  bootfile_name
+define 68      array ipaddress         mobile_ip_home_agent
+define 69      array ipaddress         smtp_server
+define 70      array ipaddress         pop_server
+define 71      array ipaddress         nntp_server
+define 72      array ipaddress         www_server
+define 73      array ipaddress         finger_server
+define 74      array ipaddress         irc_server
+define 75      array ipaddress         streettalk_server
+define 76      array ipaddress         streettalk_directory_assistance_server
+
+# DHCP User Class, RFC3004
+define 77      string                  user_class
+
+# DHCP Rapid Commit, RFC4039
+define 80      norequest flag          rapid_commit
+
+# DHCP Fully Qualified Domain Name, RFC4702
+define 81      embed                   fqdn
+embed          byte                    flags
+embed          byte                    rcode1
+embed          byte                    rcode2
+embed          domain                  fqdn
+
+# DHCP Novell Directory Services, RFC2241
+define 85      array ipaddress         nds_servers
+define 86      string                  nds_tree_name
+define 87      string                  nds_context
+
+# DHCP Broadcast and Multicast Control Server, RFC4280
+define 88      domain                  bcms_controller_names
+define 89      array ipaddress         bcms_controller_address
+
+# DHCP Leasequery, RFC4388
+define 91      uint32                  client_last_transaction_time
+define 92      array ipaddress         associated_ip
+
+# DHCP The Open Group's User Authentication Protocol, RFC2485
+define 98      string                  uap_servers
+
+# DHCP Timezone, RFC4883
+define 100     string                  posix_timezone
+define 101     string                  tzdb_timezone
+
+# DHCP Subnet Selection, RFC3011
+define 118     ipaddress               subnet_selection
+
+# DHCP Domain Search, RFC3397
+define 119     domain                  domain_search
+
+# DHCP Session Initiated Protocol Servers, RFC3361
+define 120     rfc3361                 sip_server
+
+# DHCP IPv6 Rapid Deployment on IPv4 Infrastructures, RFC5969
+define 212     rfc5969                 sixrd
+
+##############################################################################
+# DHCPv6 options, RFC3315
+define6 1      binhex                  client_id
+define6 2      binhex                  server_id
+
+# DHCPv6 addresses.
+# These are currently handled internally by dhcpcd(8) and only
+# the addresses are exposed to dhcpcd-run-hooks(8).
+# When they can be expressed properly they will be uncommented.
+# many signifies that it could occur more than once and be index.
+# option signifies that the specified option can be encapsulated.
+# For example:
+#      ia_na_count=1
+#      ia_na_1_iaid="00112233"
+#      ia_na_1_t1=3600
+#      ia_na_1_t2=7200
+#      ia_na_1_ia_addr_count=1
+#      ia_na_1_ia_addr_1_addr="dead:beef"
+#      ia_na_1_ia_addr_1_pltime="3600"
+#      ia_na_1_ia_addr_1_pltime="7200"
+#      ia_na_1_ia_addr_1_status_code=0
+#      ia_na_1_ia_addr_1_status_code_message="OK"
+#      ia_na_1_code=0
+#      ia_na_1_status_code_message="OK"
+#
+#define6 3     embed many              ia_na
+#embed         uint32                  iaid
+#embed         uint32                  t1
+#embed         uint32                  t2
+#encap         option                  5
+#encap         option                  13
+#define6 4     embed many              ia_ta
+#embed         uint32                  iaid
+#encap         option                  5
+#encap         option                  13
+#define6 5     embed many              ia_addr
+#embed         ip6address              addr
+#embed         uint32                  pltime
+#embed         uint32                  vltime
+#encap         option                  13
+
+define6 6      array uint16            option_request
+define6 7      byte                    preference
+define6 8      uint16                  elased_time
+define6 9      binhex                  dhcp_relay_msg
+
+define6 11     embed                   auth
+embed          byte                    protocol
+embed          byte                    algorithm
+embed          binhex:8                replay_detection
+embed          binhex                  information
+
+define6 12     ip6address              unicast
+
+define6 13     norequest embed         status_code
+embed          uint16                  status_code
+embed          string                  message
+
+define6 14     norequest flag          rapid_commit
+define6 15     binhex                  user_class
+define6 16     binhex                  vendor_class
+define6 17     binhex                  vendor_options
+define6 18     binhex                  interface_id
+define6 19     byte                    reconfigure_msg
+define6 20     flag                    reconfigure_accept
+
+# DHCPv6 Session Initiation Protocol Options, RFC3319
+define6 21     domain                  sip_servers_names
+define6 22     array ip6address        sip_servers_addresses
+
+# DHCPv6 DNS Configuration Options, RFC3646
+define6 23     array ip6address        name_servers
+define6 24     domain                  domain_search
+
+# DHCPv6 Network Information Service Options, RFC3898
+define6 27     array ip6address        nis_servers
+define6 28     array ip6address        nisp_servers
+define6 29     domain                  nis_domain_name
+define6 30     domain                  nisp_domain_name
+
+# DHCPv6 Simple Network Time Protocol Servers Option, RFC4075
+define6 31     array ip6address        sntp_servers
+
+# DHCPv6 Information Refresh Time, RFC4242
+define6 32     uint32                  info_refresh_time
+
+# DHCPv6 Broadcast and Multicast Control Server, RFC4280
+define6 33     domain                  bcms_server_d
+define6 34     array ip6address        bcms_server_a
+
+# DHCPv6 Fully Qualified Domain Name, RFC4704
+define6 39     embed                   fqdn
+embed          byte                    fqdn_flags
+embed          domain                  fqdn
+
+# DHCPv6 Timezone options, RFC4883
+define6 41     string                  posix_timezone
+define6 42     string                  tzdb_timezone
+
+# DHCPv6 Network Time Protocol Server, RFC5908
+define6 56     encap                   ntp_server
+encap 1                ip6address              addr
+encap 2                ip6address              mcast_addr
+encap 3                ip6address              fqdn
diff --git a/dhcpcd-embedded.conf b/dhcpcd-embedded.conf
deleted file mode 100644 (file)
index c413422..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-# Embedded option definitions for dhcpcd(8)
-
-# DHCP Fully Qualified Domain Name, RFC4702
-define 81      embed                   fqdn
-embed          byte                    flags
-embed          byte                    rcode1
-embed          byte                    rcode2
-embed          domain                  fqdn
-
-# DHCPv6 Fully Qualified Domain Name, RFC4704
-define6 39     embed                   fqdn
-embed          byte                    flags
-embed          domain                  fqdn
-
-# DHCPv6 Network Time Protocol Server, RFC5908
-define6 56     encap                   ntp_server
-encap 1                ip6address              addr
-encap 2                ip6address              mcast_addr
-encap 3                ip6address              fqdn
index 3c4fea1526bf49f5ae9583e7d801fbc241c8d2ca..9137a65eb35a987a7acc49e87b9c5d9834dd55a2 100644 (file)
--- a/dhcpcd.c
+++ b/dhcpcd.c
@@ -149,14 +149,14 @@ free_globals(void)
        free(ifdv);
 
 #ifdef INET
-       for (n = 0; n < dhcp_eopts_len; n++)
-               free_dhcp_opt_embenc(&dhcp_eopts[n]);
-       free(dhcp_eopts);
+       for (n = 0; n < dhcp_opts_len; n++)
+               free_dhcp_opt_embenc(&dhcp_opts[n]);
+       free(dhcp_opts);
 #endif
 #ifdef INET6
-       for (n = 0; n < dhcp6_eopts_len; n++)
-               free_dhcp_opt_embenc(&dhcp6_eopts[n]);
-       free(dhcp6_eopts);
+       for (n = 0; n < dhcp6_opts_len; n++)
+               free_dhcp_opt_embenc(&dhcp6_opts[n]);
+       free(dhcp6_opts);
 #endif
 }
 
index 1eb2426e6293a6b1deb1eff30d3922d366a98ab8..d16daab5b06c513ed8ba6857669321d4b681085b 100755 (executable)
--- a/genembedc
+++ b/genembedc
@@ -2,7 +2,7 @@
 set -e
 
 : ${TOOL_SED:=sed}
-CONF=${1:-dhcpcd-embedded.conf}
+CONF=${1:-dhcpcd-definitions.conf}
 
 cat <<EOF
 /*
index 7d29c754eb8b44b129cf8a58c6a81a47d125dac2..a155cfae435fa24174f6800eefc07875fef79da9 100755 (executable)
--- a/genembedh
+++ b/genembedh
@@ -4,7 +4,7 @@ set -e
 : ${TOOL_SED:=sed}
 : ${TOOL_GREP:=grep}
 : ${TOOL_WC:=wc}
-CONF=${1:-dhcpcd-embedded.conf}
+CONF=${1:-dhcpcd-definitions.conf}
 H=${2:-dhcpcd-embedded.h.in}
 
 INITDEFINES=$($TOOL_GREP "^define " $CONF | $TOOL_WC -l)
index b665cfeafe8a33c8ccb2326afbc24a05bdd09f27..378670e504dc4662b3f736a19020565504b01aec 100644 (file)
@@ -451,7 +451,7 @@ parse_addr(__unused struct in_addr *addr, __unused struct in_addr *net,
 #endif
 
 static const char *
-set_option_space(const char *arg, const struct dhcp_opt **d,
+set_option_space(const char *arg, const struct dhcp_opt **d, size_t *dl,
     struct if_options *ifo,
     uint8_t *request[], uint8_t *require[], uint8_t *no[])
 {
@@ -459,6 +459,7 @@ set_option_space(const char *arg, const struct dhcp_opt **d,
 #ifdef INET6
        if (strncmp(arg, "dhcp6_", strlen("dhcp6_")) == 0) {
                *d = dhcp6_opts;
+               *dl = dhcp6_opts_len;
                *request = ifo->requestmask6;
                *require = ifo->requiremask6;
                *no = ifo->nomask6;
@@ -468,8 +469,10 @@ set_option_space(const char *arg, const struct dhcp_opt **d,
 
 #ifdef INET
        *d = dhcp_opts;
+       *dl = dhcp_opts_len;
 #else
        *d = NULL;
+       *dl = 0;
 #endif
        *request = ifo->requestmask;
        *require = ifo->requiremask;
@@ -623,8 +626,9 @@ parse_option(struct if_options *ifo, int opt, const char *arg)
                }
                break;
        case 'o':
-               arg = set_option_space(arg, &d, ifo, &request, &require, &no);
-               if (make_option_mask(d, request, arg, 1) != 0) {
+               arg = set_option_space(arg, &d, &dl, ifo,
+                   &request, &require, &no);
+               if (make_option_mask(d, dl, request, arg, 1) != 0) {
                        syslog(LOG_ERR, "unknown option `%s'", arg);
                        return -1;
                }
@@ -836,19 +840,21 @@ parse_option(struct if_options *ifo, int opt, const char *arg)
                ifo->options &= ~DHCPCD_IPV4LL;
                break;
        case 'O':
-               arg = set_option_space(arg, &d, ifo, &request, &require, &no);
-               if (make_option_mask(d, request, arg, -1) != 0 ||
-                   make_option_mask(d, require, arg, -1) != 0 ||
-                   make_option_mask(d, no, arg, 1) != 0)
+               arg = set_option_space(arg, &d, &dl, ifo,
+                   &request, &require, &no);
+               if (make_option_mask(d, dl, request, arg, -1) != 0 ||
+                   make_option_mask(d, dl, require, arg, -1) != 0 ||
+                   make_option_mask(d, dl, no, arg, 1) != 0)
                {
                        syslog(LOG_ERR, "unknown option `%s'", arg);
                        return -1;
                }
                break;
        case 'Q':
-               arg = set_option_space(arg, &d, ifo, &request, &require, &no);
-               if (make_option_mask(d, require, arg, 1) != 0 ||
-                   make_option_mask(d, request, arg, 1) != 0)
+               arg = set_option_space(arg, &d, &dl, ifo,
+                   &request, &require, &no);
+               if (make_option_mask(d, dl, require, arg, 1) != 0 ||
+                   make_option_mask(d, dl, request, arg, 1) != 0)
                {
                        syslog(LOG_ERR, "unknown option `%s'", arg);
                        return -1;
@@ -1024,7 +1030,8 @@ parse_option(struct if_options *ifo, int opt, const char *arg)
                ifo->arping[ifo->arping_len++] = addr.s_addr;
                break;
        case O_DESTINATION:
-               if (make_option_mask(dhcp_opts, ifo->dstmask, arg, 2) != 0) {
+               if (make_option_mask(dhcp_opts, dhcp_opts_len,
+                   ifo->dstmask, arg, 2) != 0) {
                        if (errno == EINVAL)
                                syslog(LOG_ERR, "option `%s' does not take"
                                    " an IPv4 address", arg);
@@ -1539,8 +1546,8 @@ read_config(const char *file,
                free(buf);
 #endif
 #ifdef INET
-               dhcp_eopts = ifo->dhcp_override;
-               dhcp_eopts_len = ifo->dhcp_override_len;
+               dhcp_opts = ifo->dhcp_override;
+               dhcp_opts_len = ifo->dhcp_override_len;
 #else
                for (i = 0; i < ifo->dhcp_override_len; i++)
                        free_dhcp_opt_embenc(&ifo->dhcp_override[i]);
@@ -1550,8 +1557,8 @@ read_config(const char *file,
                ifo->dhcp_override_len = 0;
 
 #ifdef INET6
-               dhcp6_eopts = ifo->dhcp6_override;
-               dhcp6_eopts_len = ifo->dhcp6_override_len;
+               dhcp6_opts = ifo->dhcp6_override;
+               dhcp6_opts_len = ifo->dhcp6_override_len;
 #else
                for (i = 0; i < ifo->dhcp6_override_len; i++)
                        free_dhcp_opt_embenc(&ifo->dhcp6_override[i]);