summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--interface-ip.c7
-rw-r--r--interface-ip.h2
-rw-r--r--interface.c18
-rw-r--r--interface.h2
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;