From: Roy Marples Date: Mon, 14 Apr 2008 10:02:44 +0000 (+0000) Subject: Add loads more DHCP options from RFC2132 to the info file, also closes #53. X-Git-Tag: v4.0.2~496 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=754a344c75b1761d553efc442a0eb3a9b628e150;p=thirdparty%2Fdhcpcd.git Add loads more DHCP options from RFC2132 to the info file, also closes #53. --- diff --git a/configure.c b/configure.c index eca2a27c..e491089a 100644 --- a/configure.c +++ b/configure.c @@ -371,50 +371,42 @@ write_info(const struct interface *iface, const struct dhcp_message *dhcp, } if (dhcp->yiaddr) { - fprintf(f, "IPADDR=%s\n", inet_ntoa(iface->addr)); - fprintf(f, "NETMASK=%s\n", inet_ntoa(iface->net)); + fprintf(f, "IPADDR='%s'\n", inet_ntoa(iface->addr)); + fprintf(f, "NETMASK='%s'\n", inet_ntoa(iface->net)); addr.s_addr = dhcp->yiaddr & iface->net.s_addr; - fprintf(f, "NETWORK=%s\n", inet_ntoa(addr)); + fprintf(f, "NETWORK='%s'\n", inet_ntoa(addr)); if (get_option_addr(&addr.s_addr, dhcp, DHCP_BROADCAST) == -1) addr.s_addr = dhcp->yiaddr | ~iface->net.s_addr; - fprintf(f, "BROADCAST=%s\n", inet_ntoa(addr)); + fprintf(f, "BROADCAST='%s'\n", inet_ntoa(addr)); ort = get_option_routes(dhcp); doneone = 0; - fprintf(f, "ROUTES="); + fprintf(f, "ROUTES='"); for (rt = ort; rt; rt = rt->next) { if (rt->dest.s_addr == 0) continue; if (doneone) fputc(' ', f); - else { - fputc('\'', f); + else doneone = 1; - } fprintf(f, "%s", inet_ntoa(rt->dest)); fprintf(f, ",%s", inet_ntoa(rt->net)); fprintf(f, ",%s", inet_ntoa(rt->gate)); } - if (doneone) - fputc('\'', f); - fputc('\n', f); + fprintf(f, "'\n"); doneone = 0; - fprintf(f, "GATEWAYS="); + fprintf(f, "GATEWAYS='"); for (rt = ort; rt; rt = rt->next) { if (rt->dest.s_addr != 0) continue; if (doneone) fputc(' ', f); - else { - fputc('\'', f); + else doneone = 1; - } fprintf(f, "%s", inet_ntoa(rt->gate)); } - if (doneone) - fputc('\'', f); - fputc('\n', f); + fprintf(f, "'\n"); free_routes(ort); } @@ -437,18 +429,18 @@ write_info(const struct interface *iface, const struct dhcp_message *dhcp, if (!(options->options & DHCPCD_INFORM) && dhcp->yiaddr) { if (!(options->options & DHCPCD_TEST)) - fprintf(f, "LEASEDFROM=%u\n", lease->leasedfrom); - fprintf(f, "LEASETIME=%u\n", lease->leasetime); - fprintf(f, "RENEWALTIME=%u\n", lease->renewaltime); - fprintf(f, "REBINDTIME=%u\n", lease->rebindtime); + fprintf(f, "LEASEDFROM='%u'\n", lease->leasedfrom); + fprintf(f, "LEASETIME='%u'\n", lease->leasetime); + fprintf(f, "RENEWALTIME='%u'\n", lease->renewaltime); + fprintf(f, "REBINDTIME='%u'\n", lease->rebindtime); } print_clean(f, "INTERFACE", iface->name); print_clean(f, "CLASSID", options->classid); if (iface->clientid_len > 0) { - fprintf(f, "CLIENTID=%s\n", + fprintf(f, "CLIENTID='%s'\n", hwaddr_ntoa(iface->clientid, iface->clientid_len)); } - fprintf(f, "DHCPCHADDR=%s\n", + fprintf(f, "DHCPCHADDR='%s'\n", hwaddr_ntoa(iface->hwaddr, iface->hwlen)); if (!(options->options & DHCPCD_TEST)) diff --git a/dhcp.c b/dhcp.c index a352fc1d..aadadda0 100644 --- a/dhcp.c +++ b/dhcp.c @@ -36,18 +36,16 @@ #include "dhcp.h" #define OPT_REQUEST (1 << 0) -#define OPT_UINT8 (1 << 3) -#define OPT_UINT16 (1 << 4) -#define OPT_UINT32 (1 << 5) -#define OPT_IPV4 (1 << 6) -#define OPT_STRING (1 << 7) -#define OPT_RFC3361 (1 << 10) -#define OPT_RFC3397 (1 << 11) +#define OPT_UINT8 (1 << 1) +#define OPT_UINT16 (1 << 2) +#define OPT_UINT32 (1 << 3) +#define OPT_IPV4 (1 << 4) +#define OPT_STRING (1 << 5) +#define OPT_ARRAY (1 << 6) /* Not impletmented yet! */ +#define OPT_RFC3361 (1 << 7) +#define OPT_RFC3397 (1 << 8) #define OPT_IPV4R OPT_IPV4 | OPT_REQUEST -#define OPT_UINT32R OPT_UINT32 | OPT_REQUEST -#define OPT_UINT16R OPT_UINT16 | OPT_REQUEST -#define OPT_STRINGR OPT_STRING | OPT_REQUEST struct dhcp_option { uint8_t option; @@ -56,25 +54,80 @@ struct dhcp_option { }; const struct dhcp_option dhcp_options[] = { - { DHCP_SERVERID, OPT_IPV4, "SERVERID" }, { DHCP_NETMASK, OPT_IPV4R, NULL }, - { DHCP_BROADCAST, OPT_IPV4R, NULL }, - { DHCP_LEASETIME, OPT_UINT32, NULL }, - { DHCP_RENEWALTIME, OPT_UINT32R, NULL }, - { DHCP_REBINDTIME, OPT_UINT32R, NULL }, - { DHCP_MTU, OPT_UINT16R, "MTU" }, - { DHCP_STATICROUTE, OPT_IPV4R, NULL }, + { DHCP_TIMEOFFSET, OPT_UINT32, "TIMEOFFSET" }, { DHCP_ROUTER, OPT_IPV4R, NULL }, - { DHCP_HOSTNAME, OPT_STRING, "HOSTNAME" }, + { DHCP_TIMESERVER, OPT_IPV4, "TIMESERVER" }, + { DHCP_NAMESERVER, OPT_IPV4, "NAMESERVER" }, { DHCP_DNSSERVER, OPT_IPV4, "DNSSERVER" }, + { DHCP_LOGSERVER, OPT_IPV4, "LOGSERVER" }, + { DHCP_COOKIESERVER, OPT_IPV4, "COOKIESERVER" }, + { DHCP_LPRSERVER, OPT_IPV4, "LPRSERVER" }, + { DHCP_IMPRESSSERVER, OPT_IPV4, "IMPRESSSERVER" }, + { DHCP_RESOURCELOCATIONSERVER, OPT_IPV4, "RESOURCELOCATIONSERVER" }, + { DHCP_HOSTNAME, OPT_STRING, "HOSTNAME" }, + { DHCP_BOOTFILESIZE, OPT_UINT16, "BOOTFILESIZE" }, + { DHCP_MERITDUMPFILE, OPT_STRING, "MERITDUMPFILE" }, { DHCP_DNSDOMAIN, OPT_STRING, "DNSDOMAIN" }, - { DHCP_DNSSEARCH, OPT_STRING | OPT_RFC3397, "DNSSEARCH" }, - { DHCP_NTPSERVER, OPT_IPV4, "NTPSERVER" }, - { DHCP_NISSERVER, OPT_IPV4, "NISSERVER" }, - { DHCP_NISDOMAIN, OPT_IPV4, "NISDOMAIN" }, + { DHCP_SWAPSERVER, OPT_IPV4, "SWAPSERVER" }, { DHCP_ROOTPATH, OPT_STRING, "ROOTPATH" }, - { DHCP_SIPSERVER, OPT_STRING | OPT_RFC3361, "SIPSERVER" }, + { DHCP_EXTENSIONSPATH, OPT_STRING, "EXTENSIONSPATH" }, + + { DHCP_IPFORWARDING, OPT_UINT8, "IPFORWARDING" }, + { DHCP_NONLOCALSOURCEROUTING, OPT_UINT8, "NONLOCALSOURCEROUTING" }, + { DHCP_POLICYFILTER, OPT_IPV4, "POLICYFILTER" }, + { DHCP_MAXDGRAMSIZE, OPT_UINT16, "MAXDGRAMSIZE" }, + { DHCP_DEFAULTIPTTL, OPT_UINT16, "DEFAULTIPTTL" }, + { DHCP_PATHMTUAGINGTIMEOUT, OPT_UINT32, "PATHMTUAGINGTIMEOUT" }, + { DHCP_PATHMTUPLATEAUTABLE, OPT_UINT16 | OPT_ARRAY, "PATHMTUPLATEAUTABLE" }, + + { DHCP_MTU, OPT_UINT16, "MTU" }, + { DHCP_ALLSUBNETSLOCAL, OPT_UINT8, "ALLSUBNETSLOCAL" }, + { DHCP_BROADCAST, OPT_IPV4R, NULL }, + { DHCP_MASKDISCOVERY, OPT_UINT8, "MASKDISCOVERY" }, + { DHCP_MASKSUPPLIER, OPT_UINT8, "MASKSUPPLIER" }, + { DHCP_ROUTERDISCOVERY, OPT_UINT8, "ROUTERDISCOVERY" }, + { DHCP_ROUTERSOLICITATIONADDR, OPT_UINT8, "ROUTERSOLICITATIONADDR" }, + { DHCP_STATICROUTE, OPT_IPV4R, NULL }, + + { DHCP_TRAILERENCAPSULATION, OPT_UINT8, "TRAILERENCAPSULATION" }, + { DHCP_ARPCACHETIMEOUT, OPT_UINT32, "ARPCACHETIMEOUT" }, + { DHCP_ETHERNETENCAPSULATION, OPT_UINT8, "ETHERNETENCAPSULATION" }, + + { DHCP_TCPDEFAULTTTL, OPT_UINT8, "TCPDEFAULTTTL" }, + { DHCP_TCPKEEPALIVEINTERVAL, OPT_UINT32, "TCPKEEPALIVEINTERVAL" }, + { DHCP_TCPKEEPALIVEGARBAGE, OPT_UINT8, "TCPKEEPALIVEGARBAGE" }, + + { DHCP_NISDOMAIN, OPT_IPV4, "NISDOMAIN" }, + { DHCP_NISSERVER, OPT_IPV4, "NISSERVER" }, + { DHCP_NTPSERVER, OPT_IPV4, "NTPSERVER" }, + { DHCP_VENDORSPECIFICINFO, 0, "VENDORSPECIFICINFO" }, + { DHCP_NETBIOSNAMESERVER, OPT_IPV4, "NETBIOSNAMESERVER" }, + { DHCP_NETBIOSDGRAMSERVER, OPT_IPV4, "NETBIOSDGRAMSERVER" }, + { DHCP_NETBIOSNODETYPE, OPT_UINT8, "NETBIOSNODETYPE" }, + { DHCP_NETBIOSSCOPE, 0, "NETBIOSSCOPE" }, + { DHCP_XFONTSERVER, OPT_IPV4, "XFONTSERVER" }, + { DHCP_XDISPLAYMANAGER, OPT_IPV4, "XDISPLAYMANAGER" }, + { DHCP_NISPLUSDOMAIN, OPT_IPV4, "NISPLUSDOMAIN" }, + { DHCP_NISPLUSSERVER, OPT_IPV4, "NISPLUSSERVER" }, + { DHCP_MOBILEIPHOMEAGENT, OPT_IPV4, "MOBILEIPHOMEAGENT" }, + { DHCP_SMTPSERVER, OPT_IPV4, "SMTPSERVER" }, + { DHCP_POP3SERVER, OPT_IPV4, "POP3SERVER" }, + { DHCP_NNTPSERVER, OPT_IPV4, "NNTPSERVER" }, + { DHCP_WWWSERVER, OPT_IPV4, "WWWSERVER" }, + { DHCP_FINGERSERVER, OPT_IPV4, "FINGERSERVER" }, + { DHCP_IRCSERVER, OPT_IPV4, "IRCSERVER" }, + { DHCP_STREETTALKSERVER, OPT_IPV4, "STREETTALKSERVER" }, + { DHCP_STREETTALKDASERVER, OPT_IPV4, "STREETTALKDASERVER" }, + + { DHCP_LEASETIME, OPT_UINT32, NULL }, + { DHCP_SERVERID, OPT_IPV4, "SERVERID" }, + { DHCP_RENEWALTIME, OPT_UINT32 | OPT_REQUEST, NULL }, + { DHCP_REBINDTIME, OPT_UINT32 | OPT_REQUEST, NULL }, + { DHCP_MESSAGE, OPT_STRING, NULL}, + { DHCP_DNSSEARCH, OPT_STRING | OPT_RFC3397, "DNSSEARCH" }, + { DHCP_SIPSERVER, OPT_STRING | OPT_RFC3361, "SIPSERVER" }, { 0, 0, NULL } }; @@ -821,16 +874,16 @@ write_options(FILE *f, const struct dhcp_message *dhcp) ssize_t retval = 0; for (i = 0; i < sizeof(dhcp_options) / sizeof(dhcp_options[0]); i++) { - if (!dhcp_options[i].var) + if (!dhcp_options[i].var || !dhcp_options[i].type) continue; - retval += fprintf(f, "%s=", dhcp_options[i].var); + retval += fprintf(f, "%s='", dhcp_options[i].var); if (dhcp_options[i].type & OPT_STRING) { s = get_option_string(dhcp, dhcp_options[i].type); if (s) { c = clean_metas(s); - retval += fprintf(f, "'%s'", c); + retval += fprintf(f, "%s", c); free(c); free(s); } @@ -851,8 +904,6 @@ write_options(FILE *f, const struct dhcp_message *dhcp) if (dhcp_options[i].type & OPT_IPV4) { p = get_option(dhcp, dhcp_options[i].option); if (p) { - if (fputc('\'', f)) - retval++; u8 = *p++; t = p; e = p + u8; @@ -865,13 +916,9 @@ write_options(FILE *f, const struct dhcp_message *dhcp) inet_ntoa(addr)); p += sizeof(addr.s_addr); } - if (fputc('\'', f)) - retval++; } } - - if (fputc('\n', f)) - retval++; + retval += fprintf(f, "'\n"); } return retval; } diff --git a/dhcp.h b/dhcp.h index 3b24d123..3031ff5d 100644 --- a/dhcp.h +++ b/dhcp.h @@ -66,7 +66,7 @@ enum DHCP_OPTIONS { DHCP_PAD = 0, DHCP_NETMASK = 1, - DHCP_TIMEROFFSET = 2, + DHCP_TIMEOFFSET = 2, DHCP_ROUTER = 3, DHCP_TIMESERVER = 4, DHCP_NAMESERVER = 5, @@ -75,18 +75,18 @@ enum DHCP_OPTIONS DHCP_COOKIESERVER = 8, DHCP_LPRSERVER = 9, DHCP_IMPRESSSERVER = 10, - DHCP_RLSSERVER = 11, + DHCP_RESOURCELOCATIONSERVER = 11, DHCP_HOSTNAME = 12, DHCP_BOOTFILESIZE = 13, DHCP_MERITDUMPFILE = 14, DHCP_DNSDOMAIN = 15, DHCP_SWAPSERVER = 16, DHCP_ROOTPATH = 17, - DHCP_EXTENTIONSPATH = 18, + DHCP_EXTENSIONSPATH = 18, DHCP_IPFORWARDING = 19, DHCP_NONLOCALSOURCEROUTING = 20, DHCP_POLICYFILTER = 21, - DHCP_MAXDGRAMREASMSIZE = 22, + DHCP_MAXDGRAMSIZE = 22, DHCP_DEFAULTIPTTL = 23, DHCP_PATHMTUAGINGTIMEOUT = 24, DHCP_PATHMTUPLATEAUTABLE = 25, @@ -109,7 +109,7 @@ enum DHCP_OPTIONS DHCP_NTPSERVER = 42, DHCP_VENDORSPECIFICINFO = 43, DHCP_NETBIOSNAMESERVER = 44, - DHCP_NETBIOSDDSERVER = 45, + DHCP_NETBIOSDGRAMSERVER = 45, DHCP_NETBIOSNODETYPE = 46, DHCP_NETBIOSSCOPE = 47, DHCP_XFONTSERVER = 48, @@ -126,6 +126,17 @@ enum DHCP_OPTIONS DHCP_REBINDTIME = 59, DHCP_CLASSID = 60, DHCP_CLIENTID = 61, + DHCP_NISPLUSDOMAIN = 64, + DHCP_NISPLUSSERVER = 65, + DHCP_MOBILEIPHOMEAGENT = 68, + DHCP_SMTPSERVER = 69, + DHCP_POP3SERVER = 70, + DHCP_NNTPSERVER = 71, + DHCP_WWWSERVER = 72, + DHCP_FINGERSERVER = 73, + DHCP_IRCSERVER = 74, + DHCP_STREETTALKSERVER = 75, + DHCP_STREETTALKDASERVER = 76, DHCP_USERCLASS = 77, /* RFC 3004 */ DHCP_FQDN = 81, DHCP_DNSSEARCH = 119, /* RFC 3397 */