@@ -44,6 +44,7 @@ enum {
ROUTE_TYPE,
ROUTE_PROTO,
ROUTE_DISABLED,
+ ROUTE_ADVMSS,
__ROUTE_MAX
};
@@ -61,6 +62,7 @@ static const struct blobmsg_policy route_attr[__ROUTE_MAX] = {
[ROUTE_TYPE] = { .name = "type", .type = BLOBMSG_TYPE_STRING },
[ROUTE_PROTO] = { .name = "proto", .type = BLOBMSG_TYPE_STRING },
[ROUTE_DISABLED] = { .name = "disabled", .type = BLOBMSG_TYPE_BOOL },
+ [ROUTE_ADVMSS] = { .name ="advmss", .type = BLOBMSG_TYPE_INT32 },
};
const struct uci_blob_param_list route_attr_list = {
@@ -460,6 +462,11 @@ interface_ip_add_route(struct interface *iface, struct blob_attr *attr, bool v6)
route->flags |= DEVROUTE_MTU;
}
+ if ((cur = tb[ROUTE_ADVMSS]) != NULL) {
+ route->advmss = blobmsg_get_u32(cur);
+ route->flags |= DEVROUTE_ADVMSS;
+ }
+
/* Use source-based routing */
if ((cur = tb[ROUTE_SOURCE]) != NULL) {
char *saveptr, *source = alloca(blobmsg_data_len(cur));
@@ -51,6 +51,9 @@ enum device_addr_flags {
/* neighbor mac address */
DEVNEIGH_MAC = (1 << 11),
+
+ /* advertised mss */
+ DEVROUTE_ADVMSS = (1 << 12),
};
union if_addr {
@@ -98,6 +101,7 @@ struct device_route {
unsigned int type;
unsigned int proto;
time_t valid_until;
+ unsigned int advmss;
/* must be last */
enum device_addr_flags flags;
@@ -2828,13 +2828,16 @@ static int system_rt(struct device *dev, struct device_route *route, int cmd)
if (table >= 256)
nla_put_u32(msg, RTA_TABLE, table);
- if (route->flags & DEVROUTE_MTU) {
+ if (route->flags & (DEVROUTE_MTU | DEVROUTE_ADVMSS)) {
struct nlattr *metrics;
if (!(metrics = nla_nest_start(msg, RTA_METRICS)))
goto nla_put_failure;
- nla_put_u32(msg, RTAX_MTU, route->mtu);
+ if (route->flags & DEVROUTE_MTU)
+ nla_put_u32(msg, RTAX_MTU, route->mtu);
+ if (route->flags & DEVROUTE_ADVMSS)
+ nla_put_u32(msg, RTAX_ADVMSS, route->advmss);
nla_nest_end(msg, metrics);
}
@@ -642,6 +642,9 @@ interface_ip_dump_route_list(struct interface_ip_settings *ip, bool enabled)
if (route->flags & DEVROUTE_MTU)
blobmsg_add_u32(&b, "mtu", route->mtu);
+ if (route->flags & DEVROUTE_ADVMSS)
+ blobmsg_add_u32(&b, "advmss", route->advmss);
+
if (route->flags & DEVROUTE_METRIC)
blobmsg_add_u32(&b, "metric", route->metric);
@@ -651,6 +654,7 @@ interface_ip_dump_route_list(struct interface_ip_settings *ip, bool enabled)
if (route->valid_until)
blobmsg_add_u32(&b, "valid", route->valid_until - now);
+
buf = blobmsg_alloc_string_buffer(&b, "source", buflen);
inet_ntop(af, &route->source, buf, buflen);
snprintf(buf + strlen(buf), buflen - strlen(buf), "/%u", route->sourcemask);
From: Joerg Vehlow <joerg.vehlow@aox.de> --- interface-ip.c | 7 +++++++ interface-ip.h | 4 ++++ system-linux.c | 7 +++++-- ubus.c | 4 ++++ 4 files changed, 20 insertions(+), 2 deletions(-)