diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-07-03 18:14:03 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-07-03 18:14:03 +0200 |
| commit | 97ef65483a40f8622aaa73408dc0909f01ebd118 (patch) | |
| tree | e5ea5c626bedf51c271c480eedbea0b827b1f5ed | |
| parent | 7895b91743702497efc179a4fe30808e49c67977 (diff) | |
| download | busybox-w32-97ef65483a40f8622aaa73408dc0909f01ebd118.tar.gz busybox-w32-97ef65483a40f8622aaa73408dc0909f01ebd118.tar.bz2 busybox-w32-97ef65483a40f8622aaa73408dc0909f01ebd118.zip | |
udhcpc: support option 0x79 (static routes) (part of bug 341)
function old new delta
xmalloc_optname_optval - 583 +583
dhcp_option_strings 258 266 +8
dhcp_options 70 72 +2
len_of_option_as_string 11 12 +1
dhcp_option_lengths 11 12 +1
udhcp_run_script 1187 669 -518
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 4/1 up/down: 595/-518) Total: 77 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -rw-r--r-- | networking/udhcp/options.c | 4 | ||||
| -rw-r--r-- | networking/udhcp/options.h | 2 | ||||
| -rw-r--r-- | networking/udhcp/script.c | 47 |
3 files changed, 52 insertions, 1 deletions
diff --git a/networking/udhcp/options.c b/networking/udhcp/options.c index 76d6e3737..ddb894432 100644 --- a/networking/udhcp/options.c +++ b/networking/udhcp/options.c | |||
| @@ -48,6 +48,7 @@ const struct dhcp_option dhcp_options[] = { | |||
| 48 | #if ENABLE_FEATURE_UDHCP_RFC3397 | 48 | #if ENABLE_FEATURE_UDHCP_RFC3397 |
| 49 | { OPTION_STR1035 | OPTION_LIST , 0x77 }, /* search */ | 49 | { OPTION_STR1035 | OPTION_LIST , 0x77 }, /* search */ |
| 50 | #endif | 50 | #endif |
| 51 | { OPTION_STATIC_ROUTES , 0x79 }, /* DHCP_STATIC_ROUTES */ | ||
| 51 | /* MSIE's "Web Proxy Autodiscovery Protocol" support */ | 52 | /* MSIE's "Web Proxy Autodiscovery Protocol" support */ |
| 52 | { OPTION_STRING , 0xfc }, /* wpad */ | 53 | { OPTION_STRING , 0xfc }, /* wpad */ |
| 53 | 54 | ||
| @@ -97,6 +98,7 @@ const char dhcp_option_strings[] ALIGN1 = | |||
| 97 | #if ENABLE_FEATURE_UDHCP_RFC3397 | 98 | #if ENABLE_FEATURE_UDHCP_RFC3397 |
| 98 | "search" "\0" | 99 | "search" "\0" |
| 99 | #endif | 100 | #endif |
| 101 | "staticroutes" "\0" /* DHCP_STATIC_ROUTES */ | ||
| 100 | /* MSIE's "Web Proxy Autodiscovery Protocol" support */ | 102 | /* MSIE's "Web Proxy Autodiscovery Protocol" support */ |
| 101 | "wpad" "\0" | 103 | "wpad" "\0" |
| 102 | ; | 104 | ; |
| @@ -116,6 +118,8 @@ const uint8_t dhcp_option_lengths[] ALIGN1 = { | |||
| 116 | [OPTION_S16] = 2, | 118 | [OPTION_S16] = 2, |
| 117 | [OPTION_U32] = 4, | 119 | [OPTION_U32] = 4, |
| 118 | [OPTION_S32] = 4, | 120 | [OPTION_S32] = 4, |
| 121 | /* Just like OPTION_STRING, we use minimum length here */ | ||
| 122 | [OPTION_STATIC_ROUTES] = 5, | ||
| 119 | }; | 123 | }; |
| 120 | 124 | ||
| 121 | 125 | ||
diff --git a/networking/udhcp/options.h b/networking/udhcp/options.h index 9e624318f..aeed36907 100644 --- a/networking/udhcp/options.h +++ b/networking/udhcp/options.h | |||
| @@ -20,6 +20,7 @@ enum { | |||
| 20 | OPTION_S16, | 20 | OPTION_S16, |
| 21 | OPTION_U32, | 21 | OPTION_U32, |
| 22 | OPTION_S32, | 22 | OPTION_S32, |
| 23 | OPTION_STATIC_ROUTES, | ||
| 23 | }; | 24 | }; |
| 24 | 25 | ||
| 25 | /* Client requests this option by default */ | 26 | /* Client requests this option by default */ |
| @@ -68,6 +69,7 @@ enum { | |||
| 68 | #define DHCP_VENDOR 0x3c | 69 | #define DHCP_VENDOR 0x3c |
| 69 | #define DHCP_CLIENT_ID 0x3d | 70 | #define DHCP_CLIENT_ID 0x3d |
| 70 | #define DHCP_FQDN 0x51 | 71 | #define DHCP_FQDN 0x51 |
| 72 | #define DHCP_STATIC_ROUTES 0x79 | ||
| 71 | #define DHCP_END 0xFF | 73 | #define DHCP_END 0xFF |
| 72 | /* Offsets in option byte sequence */ | 74 | /* Offsets in option byte sequence */ |
| 73 | #define OPT_CODE 0 | 75 | #define OPT_CODE 0 |
diff --git a/networking/udhcp/script.c b/networking/udhcp/script.c index 94dabf4d1..f315008a3 100644 --- a/networking/udhcp/script.c +++ b/networking/udhcp/script.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | static const uint8_t len_of_option_as_string[] = { | 17 | static const uint8_t len_of_option_as_string[] = { |
| 18 | [OPTION_IP] = sizeof("255.255.255.255 "), | 18 | [OPTION_IP] = sizeof("255.255.255.255 "), |
| 19 | [OPTION_IP_PAIR] = sizeof("255.255.255.255 ") * 2, | 19 | [OPTION_IP_PAIR] = sizeof("255.255.255.255 ") * 2, |
| 20 | [OPTION_STATIC_ROUTES]= sizeof("255.255.255.255/32 255.255.255.255 "), | ||
| 20 | [OPTION_STRING] = 1, | 21 | [OPTION_STRING] = 1, |
| 21 | #if ENABLE_FEATURE_UDHCP_RFC3397 | 22 | #if ENABLE_FEATURE_UDHCP_RFC3397 |
| 22 | [OPTION_STR1035] = 1, | 23 | [OPTION_STR1035] = 1, |
| @@ -51,7 +52,7 @@ static int mton(uint32_t mask) | |||
| 51 | 52 | ||
| 52 | 53 | ||
| 53 | /* Create "opt_name=opt_value" string */ | 54 | /* Create "opt_name=opt_value" string */ |
| 54 | static char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_option *type_p, const char *opt_name) | 55 | static NOINLINE char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_option *type_p, const char *opt_name) |
| 55 | { | 56 | { |
| 56 | unsigned upper_length; | 57 | unsigned upper_length; |
| 57 | int len, type, optlen; | 58 | int len, type, optlen; |
| @@ -106,6 +107,50 @@ static char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_option *t | |||
| 106 | memcpy(dest, option, len); | 107 | memcpy(dest, option, len); |
| 107 | dest[len] = '\0'; | 108 | dest[len] = '\0'; |
| 108 | return ret; /* Short circuit this case */ | 109 | return ret; /* Short circuit this case */ |
| 110 | case OPTION_STATIC_ROUTES: { | ||
| 111 | /* Option binary format: | ||
| 112 | * mask [one byte, 0..32] | ||
| 113 | * ip [big endian, 0..4 bytes depending on mask] | ||
| 114 | * router [big endian, 4 bytes] | ||
| 115 | * may be repeated | ||
| 116 | * | ||
| 117 | * We convert it to a string "IP/MASK ROUTER IP2/MASK2 ROUTER2" | ||
| 118 | */ | ||
| 119 | const char *pfx = ""; | ||
| 120 | |||
| 121 | while (len >= 1 + 4) { /* mask + 0-byte ip + router */ | ||
| 122 | uint32_t nip; | ||
| 123 | uint8_t *p; | ||
| 124 | unsigned mask; | ||
| 125 | int bytes; | ||
| 126 | |||
| 127 | mask = *option++; | ||
| 128 | if (mask > 32) | ||
| 129 | break; | ||
| 130 | len--; | ||
| 131 | |||
| 132 | nip = 0; | ||
| 133 | p = (void*) &nip; | ||
| 134 | bytes = (mask + 7) / 8; /* 0 -> 0, 1..8 -> 1, 9..16 -> 2 etc */ | ||
| 135 | while (--bytes >= 0) { | ||
| 136 | *p++ = *option++; | ||
| 137 | len--; | ||
| 138 | } | ||
| 139 | if (len < 4) | ||
| 140 | break; | ||
| 141 | |||
| 142 | /* print ip/mask */ | ||
| 143 | dest += sprint_nip(dest, pfx, (void*) &nip); | ||
| 144 | pfx = " "; | ||
| 145 | dest += sprintf(dest, "/%u ", mask); | ||
| 146 | /* print router */ | ||
| 147 | dest += sprint_nip(dest, "", option); | ||
| 148 | option += 4; | ||
| 149 | len -= 4; | ||
| 150 | } | ||
| 151 | |||
| 152 | return ret; | ||
| 153 | } | ||
| 109 | #if ENABLE_FEATURE_UDHCP_RFC3397 | 154 | #if ENABLE_FEATURE_UDHCP_RFC3397 |
| 110 | case OPTION_STR1035: | 155 | case OPTION_STR1035: |
| 111 | /* unpack option into dest; use ret for prefix (i.e., "optname=") */ | 156 | /* unpack option into dest; use ret for prefix (i.e., "optname=") */ |
