X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=proto-shell.c;h=2317209b2442c8619adc7ed1a62f6eb87234a11f;hp=6b38ee9505951087f0f22f5355ea4774dc8e17ea;hb=120cd39654a33401423f1b65bb19e12681a6e46f;hpb=c1726af17577aa606715ee6bed6d18fc2c5c636c diff --git a/proto-shell.c b/proto-shell.c index 6b38ee9..2317209 100644 --- a/proto-shell.c +++ b/proto-shell.c @@ -381,6 +381,8 @@ enum { NOTIFY_DATA, NOTIFY_KEEP, NOTIFY_HOST, + NOTIFY_DNS, + NOTIFY_DNS_SEARCH, __NOTIFY_LAST }; @@ -400,6 +402,8 @@ static const struct blobmsg_policy notify_attr[__NOTIFY_LAST] = { [NOTIFY_DATA] = { .name = "data", .type = BLOBMSG_TYPE_TABLE }, [NOTIFY_KEEP] = { .name = "keep", .type = BLOBMSG_TYPE_BOOL }, [NOTIFY_HOST] = { .name = "host", .type = BLOBMSG_TYPE_STRING }, + [NOTIFY_DNS] = { .name = "dns", .type = BLOBMSG_TYPE_ARRAY }, + [NOTIFY_DNS_SEARCH] = { .name = "dns_search", .type = BLOBMSG_TYPE_ARRAY }, }; static int @@ -464,6 +468,12 @@ proto_shell_update_link(struct proto_shell_state *state, struct blob_attr *data, if ((cur = tb[NOTIFY_ROUTES6]) != NULL) proto_shell_parse_route_list(state->proto.iface, cur, true); + if ((cur = tb[NOTIFY_DNS])) + interface_add_dns_server_list(&iface->proto_ip, cur); + + if ((cur = tb[NOTIFY_DNS_SEARCH])) + interface_add_dns_search_list(&iface->proto_ip, cur); + interface_update_complete(state->proto.iface); if (!keep) @@ -625,6 +635,22 @@ proto_shell_add_host_dependency(struct proto_shell_state *state, struct blob_att } static int +proto_shell_setup_failed(struct proto_shell_state *state) +{ + switch (state->sm) { + case S_IDLE: + state->proto.proto_event(&state->proto, IFPEV_LINK_LOST); + /* fall through */ + case S_SETUP: + proto_shell_handler(&state->proto, PROTO_CMD_TEARDOWN, false); + break; + default: + break; + } + return 0; +} + +static int proto_shell_notify(struct interface_proto_state *proto, struct blob_attr *attr) { struct proto_shell_state *state; @@ -651,6 +677,8 @@ proto_shell_notify(struct interface_proto_state *proto, struct blob_attr *attr) return proto_shell_set_available(state, tb); case 6: return proto_shell_add_host_dependency(state, tb); + case 7: + return proto_shell_setup_failed(state); default: return UBUS_STATUS_INVALID_ARGUMENT; }