From a609b5e8f39b132ff72476761add46d263c4147f Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Mon, 19 Mar 2012 23:26:44 +0100 Subject: [PATCH] add support for updating route metrics --- interface-ip.c | 7 +++++-- interface-ip.h | 2 +- interface.c | 18 +++++++++++++++--- interface.h | 2 ++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/interface-ip.c b/interface-ip.c index 56f3c0c..8c46168 100644 --- a/interface-ip.c +++ b/interface-ip.c @@ -377,9 +377,12 @@ void interface_ip_set_enabled(struct interface_ip_settings *ip, bool enabled) if (route->enabled == _enabled) continue; - if (_enabled) + if (_enabled) { + if (!(route->flags & DEVROUTE_METRIC)) + route->metric = ip->iface->metric; + system_add_route(dev, route); - else + } else system_del_route(dev, route); route->enabled = _enabled; } diff --git a/interface-ip.h b/interface-ip.h index 68bfdf6..df5545d 100644 --- a/interface-ip.h +++ b/interface-ip.h @@ -76,6 +76,6 @@ void interface_ip_update_start(struct interface_ip_settings *ip); void interface_ip_update_complete(struct interface_ip_settings *ip); void interface_ip_flush(struct interface_ip_settings *ip); void interface_ip_set_enabled(struct interface_ip_settings *ip, bool enabled); - +void interface_ip_update_metric(struct interface_ip_settings *ip, int metric); #endif diff --git a/interface.c b/interface.c index 4ad89f5..f281a9b 100644 --- a/interface.c +++ b/interface.c @@ -18,6 +18,7 @@ enum { IFACE_ATTR_PROTO, IFACE_ATTR_AUTO, IFACE_ATTR_DEFAULTROUTE, + IFACE_ATTR_METRIC, IFACE_ATTR_MAX }; @@ -26,6 +27,7 @@ static const struct blobmsg_policy iface_attrs[IFACE_ATTR_MAX] = { [IFACE_ATTR_IFNAME] = { .name = "ifname", .type = BLOBMSG_TYPE_STRING }, [IFACE_ATTR_AUTO] = { .name = "auto", .type = BLOBMSG_TYPE_BOOL }, [IFACE_ATTR_DEFAULTROUTE] = { .name = "defaultroute", .type = BLOBMSG_TYPE_BOOL }, + [IFACE_ATTR_METRIC] = { .name = "metric", .type = BLOBMSG_TYPE_INT32 }, }; const struct config_param_list interface_attr_list = { @@ -516,11 +518,21 @@ interface_change_config(struct interface *if_old, struct interface *if_new) goto reload; } - if (if_old->proto_ip.no_defaultroute != if_new->proto_ip.no_defaultroute) { - if_old->proto_ip.no_defaultroute = if_new->proto_ip.no_defaultroute; - interface_ip_set_enabled(&if_old->proto_ip, if_old->proto_ip.enabled); +#define UPDATE(field) ({ \ + bool __changed = (if_old->field != if_new->field); \ + if_old->field = if_new->field; \ + __changed; \ + }) + + if (UPDATE(metric) || UPDATE(proto_ip.no_defaultroute)) { + interface_ip_set_enabled(&if_old->config_ip, false); + interface_ip_set_enabled(&if_old->config_ip, if_new->config_ip.enabled); + interface_ip_set_enabled(&if_old->proto_ip, false); + interface_ip_set_enabled(&if_old->proto_ip, if_new->proto_ip.enabled); } +#undef UPDATE + goto out; reload: diff --git a/interface.h b/interface.h index 750c0f2..f0b26f5 100644 --- a/interface.h +++ b/interface.h @@ -87,6 +87,8 @@ struct interface { struct interface_ip_settings proto_ip; struct interface_ip_settings config_ip; + int metric; + /* errors/warnings while trying to bring up the interface */ struct list_head errors; -- 2.11.0