Add support for DHCP static route options

This adds support for DHCP options 33 and 121: Static Route and
Classless Static Route. To enable this feature, set UseRoutes=true
in .network file. Returned routes are added to the routing table.
This commit is contained in:
Eugene Yakubovich
2014-06-29 15:18:21 +02:00
committed by Tom Gundersen
parent ed942a9eb2
commit e1ea665eda
12 changed files with 404 additions and 6 deletions
+86
View File
@@ -28,6 +28,7 @@
#include "siphash24.h"
#include "libudev-private.h"
#include "network-internal.h"
#include "dhcp-lease-internal.h"
#include "log.h"
#include "utf8.h"
#include "util.h"
@@ -432,3 +433,88 @@ int deserialize_in6_addrs(struct in6_addr **ret, size_t *ret_size, const char *s
return 0;
}
void serialize_dhcp_routes(FILE *f, const char *key, struct sd_dhcp_route *routes, size_t size) {
unsigned i;
assert(f);
assert(key);
assert(routes);
assert(size);
fprintf(f, "%s=", key);
for (i = 0; i < size; i++)
fprintf(f, "%s/%" PRIu8 ",%s%s", inet_ntoa(routes[i].dst_addr),
routes[i].dst_prefixlen, inet_ntoa(routes[i].gw_addr),
(i < (size - 1)) ? " ": "");
fputs("\n", f);
}
int deserialize_dhcp_routes(struct sd_dhcp_route **ret, size_t *ret_size, size_t *ret_allocated, const char *string) {
_cleanup_free_ struct sd_dhcp_route *routes = NULL;
size_t size = 0, allocated = 0;
char *word, *state;
size_t len;
assert(ret);
assert(ret_size);
assert(ret_allocated);
assert(string);
FOREACH_WORD(word, len, string, state) {
/* WORD FORMAT: dst_ip/dst_prefixlen,gw_ip */
_cleanup_free_ char* entry;
char *tok, *tok_end;
unsigned n;
int r;
if (!GREEDY_REALLOC(routes, allocated, size + 1))
return -ENOMEM;
entry = strndup(word, len);
tok = entry;
/* get the subnet */
tok_end = strchr(tok, '/');
if (!tok_end)
continue;
*tok_end = '\0';
r = inet_aton(tok, &routes[size].dst_addr);
if (r == 0)
continue;
tok = tok_end + 1;
/* get the prefixlen */
tok_end = strchr(tok, ',');
if (!tok_end)
continue;
*tok_end = '\0';
r = safe_atou(tok, &n);
if (r < 0 || n > 32)
continue;
routes[size].dst_prefixlen = (uint8_t) n;
tok = tok_end + 1;
/* get the gateway */
r = inet_aton(tok, &routes[size].gw_addr);
if (r == 0)
continue;
size++;
}
*ret_size = size;
*ret_allocated = allocated;
*ret = routes;
routes = NULL;
return 0;
}