summaryrefslogtreecommitdiff
path: root/proto-shell.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2011-10-19 20:51:57 +0200
committerFelix Fietkau <nbd@openwrt.org>2011-10-19 20:51:57 +0200
commit33a44b9c7d5e8c87303b8126fe9e01f8979f48e5 (patch)
tree89132c13680bf45b40af171194c3dd1e27f9aae2 /proto-shell.c
parenta0dedf26ed338ef420784541da0676ad91e181a7 (diff)
downloadnetifd-33a44b9c7d5e8c87303b8126fe9e01f8979f48e5.tar.gz
rework route handling, move parser code to interface-ip.c, add extra options and add further support for pulling routes from config
Diffstat (limited to 'proto-shell.c')
-rw-r--r--proto-shell.c74
1 files changed, 6 insertions, 68 deletions
diff --git a/proto-shell.c b/proto-shell.c
index ae4ebd3..eb60fc1 100644
--- a/proto-shell.c
+++ b/proto-shell.c
@@ -187,70 +187,8 @@ proto_shell_parse_addr_list(struct interface_ip_settings *ip, struct blob_attr *
}
}
-enum {
- ROUTE_TARGET,
- ROUTE_MASK,
- ROUTE_GATEWAY,
- ROUTE_DEVICE,
- __ROUTE_LAST
-};
-
-static const struct blobmsg_policy route_attr[__ROUTE_LAST] = {
- [ROUTE_TARGET] = { .name = "target", .type = BLOBMSG_TYPE_STRING },
- [ROUTE_MASK] = { .name = "mask", .type = BLOBMSG_TYPE_STRING },
- [ROUTE_GATEWAY] = { .name = "gateway", .type = BLOBMSG_TYPE_STRING },
- [ROUTE_DEVICE] = { .name = "device", .type = BLOBMSG_TYPE_STRING },
-};
-
-static void
-parse_route(struct interface_ip_settings *ip, struct blob_attr *attr, bool v6)
-{
- struct blob_attr *tb[__ROUTE_LAST], *cur;
- struct device_route *route;
- int af = v6 ? AF_INET6 : AF_INET;
-
- blobmsg_parse(route_attr, __ROUTE_LAST, tb, blobmsg_data(attr), blobmsg_data_len(attr));
-
- if (!tb[ROUTE_GATEWAY] && !tb[ROUTE_DEVICE])
- return;
-
- route = calloc(1, sizeof(*route));
- if (!route)
- return;
-
- route->mask = v6 ? 128 : 32;
- if ((cur = tb[ROUTE_MASK]) != NULL) {
- route->mask = parse_netmask_string(blobmsg_data(cur), v6);
- if (route->mask > (v6 ? 128 : 32))
- goto error;
- }
-
- if ((cur = tb[ROUTE_TARGET]) != NULL) {
- if (!inet_pton(af, blobmsg_data(cur), &route->addr)) {
- DPRINTF("Failed to parse route target: %s\n", (char *) blobmsg_data(cur));
- goto error;
- }
- }
-
- if ((cur = tb[ROUTE_GATEWAY]) != NULL) {
- if (!inet_pton(af, blobmsg_data(cur), &route->nexthop)) {
- DPRINTF("Failed to parse route gateway: %s\n", (char *) blobmsg_data(cur));
- goto error;
- }
- }
-
- if ((cur = tb[ROUTE_DEVICE]) != NULL)
- route->device = device_get(blobmsg_data(cur), true);
-
- vlist_add(&ip->route, &route->node);
- return;
-
-error:
- free(route);
-}
-
static void
-proto_shell_parse_route_list(struct interface_ip_settings *ip, struct blob_attr *attr,
+proto_shell_parse_route_list(struct interface *iface, struct blob_attr *attr,
bool v6)
{
struct blob_attr *cur;
@@ -262,7 +200,7 @@ proto_shell_parse_route_list(struct interface_ip_settings *ip, struct blob_attr
continue;
}
- parse_route(ip, cur, v6);
+ interface_ip_add_route(iface, cur, v6);
}
}
@@ -330,7 +268,7 @@ proto_shell_update_link(struct proto_shell_state *state, struct blob_attr **tb)
}
ip = &state->proto.iface->proto_ip;
- interface_ip_update_start(ip);
+ interface_update_start(state->proto.iface);
if ((cur = tb[NOTIFY_ADDR_EXT]) != NULL)
addr_ext = blobmsg_get_bool(cur);
@@ -342,10 +280,10 @@ proto_shell_update_link(struct proto_shell_state *state, struct blob_attr **tb)
proto_shell_parse_addr_list(ip, cur, true, addr_ext);
if ((cur = tb[NOTIFY_ROUTES]) != NULL)
- proto_shell_parse_route_list(ip, cur, false);
+ proto_shell_parse_route_list(state->proto.iface, cur, false);
if ((cur = tb[NOTIFY_ROUTES6]) != NULL)
- proto_shell_parse_route_list(ip, cur, true);
+ proto_shell_parse_route_list(state->proto.iface, cur, true);
if ((cur = tb[NOTIFY_DNS]) != NULL)
interface_add_dns_server_list(ip, cur);
@@ -353,7 +291,7 @@ proto_shell_update_link(struct proto_shell_state *state, struct blob_attr **tb)
if ((cur = tb[NOTIFY_DNS_SEARCH]) != NULL)
interface_add_dns_search_list(ip, cur);
- interface_ip_update_complete(ip);
+ interface_update_complete(state->proto.iface);
state->proto.proto_event(&state->proto, IFPEV_UP);