aboutsummaryrefslogtreecommitdiff
path: root/networking/udhcp/script.c
diff options
context:
space:
mode:
Diffstat (limited to 'networking/udhcp/script.c')
-rw-r--r--networking/udhcp/script.c47
1 files changed, 46 insertions, 1 deletions
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 @@
17static const uint8_t len_of_option_as_string[] = { 17static 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 */
54static char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_option *type_p, const char *opt_name) 55static 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=") */