diff options
Diffstat (limited to 'networking/udhcp/script.c')
-rw-r--r-- | networking/udhcp/script.c | 47 |
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 @@ | |||
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=") */ |