X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=interface.c;h=2aab37cc9ecdf97949c94a9a62d44633fa3e4785;hb=bc22047b1d3ce18cdb00110dd37c6faa889f3921;hp=848990eae5b5a305d120192fe5fe9b377116e11e;hpb=8795f9ef89626cd658f615c78c6a17e990c0dcaa;p=project%2Fnetifd.git diff --git a/interface.c b/interface.c index 848990e..2aab37c 100644 --- a/interface.c +++ b/interface.c @@ -75,6 +75,8 @@ const struct uci_blob_param_list interface_attr_list = { static void set_config_state(struct interface *iface, enum interface_config_state s); +static void +interface_event(struct interface *iface, enum interface_event ev); static void interface_error_flush(struct interface *iface) @@ -195,6 +197,25 @@ interface_add_data(struct interface *iface, const struct blob_attr *data) return 0; } +int interface_parse_data(struct interface *iface, const struct blob_attr *attr) +{ + struct blob_attr *cur; + int rem, ret; + + iface->updated = 0; + + blob_for_each_attr(cur, attr, rem) { + ret = interface_add_data(iface, cur); + if (ret) + return ret; + } + + if (iface->updated && iface->state == IFS_UP) + interface_event(iface, IFEV_UPDATE); + + return 0; +} + static void interface_event(struct interface *iface, enum interface_event ev) { @@ -240,6 +261,7 @@ mark_interface_down(struct interface *iface) if (state == IFS_UP) interface_event(iface, IFEV_DOWN); interface_ip_set_enabled(&iface->config_ip, false); + interface_ip_set_enabled(&iface->proto_ip, false); interface_ip_flush(&iface->proto_ip); interface_flush_state(iface); system_flush_routes(); @@ -649,7 +671,7 @@ interface_handle_config_change(struct interface *iface) } static void -interface_proto_cb(struct interface_proto_state *state, enum interface_proto_event ev) +interface_proto_event_cb(struct interface_proto_state *state, enum interface_proto_event ev) { struct interface *iface = state->iface; @@ -664,6 +686,7 @@ interface_proto_cb(struct interface_proto_state *state, enum interface_proto_eve interface_set_l3_dev(iface, iface->main_dev.dev); interface_ip_set_enabled(&iface->config_ip, true); + interface_ip_set_enabled(&iface->proto_ip, true); system_flush_routes(); iface->state = IFS_UP; iface->start_time = system_get_rtime(); @@ -708,7 +731,7 @@ void interface_set_proto_state(struct interface *iface, struct interface_proto_s if (!state) return; - state->proto_event = interface_proto_cb; + state->proto_event = interface_proto_event_cb; state->iface = iface; } @@ -873,6 +896,7 @@ interface_set_l3_dev(struct interface *iface, struct device *dev) return; interface_ip_set_enabled(&iface->config_ip, false); + interface_ip_set_enabled(&iface->proto_ip, false); interface_ip_flush(&iface->proto_ip); device_add_user(&iface->l3_dev, dev); @@ -882,6 +906,7 @@ interface_set_l3_dev(struct interface *iface, struct device *dev) return; } interface_ip_set_enabled(&iface->config_ip, enabled); + interface_ip_set_enabled(&iface->proto_ip, enabled); } }