X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=system-linux.c;h=db78240a59662de9ee548d830ad5ac04fe81a0a9;hp=e5364e06ddbce8e6f3951326426339abfcd6bceb;hb=7d79d0a8aa5a5b4c1ed987af119356438d98fe7b;hpb=5dd87fd8ad3a42c71d90a8fecc893af973e552bf diff --git a/system-linux.c b/system-linux.c index e5364e0..db78240 100644 --- a/system-linux.c +++ b/system-linux.c @@ -41,7 +41,6 @@ #define RTN_FAILED_POLICY 12 #endif -#include #include #include #include @@ -1068,6 +1067,7 @@ static int system_rt(struct device *dev, struct device_route *route, int cmd) struct rtmsg rtm = { .rtm_family = (alen == 4) ? AF_INET : AF_INET6, .rtm_dst_len = route->mask, + .rtm_src_len = route->sourcemask, .rtm_table = (table < 256) ? table : RT_TABLE_UNSPEC, .rtm_protocol = (route->flags & DEVADDR_KERNEL) ? RTPROT_KERNEL : RTPROT_STATIC, .rtm_scope = scope, @@ -1093,6 +1093,9 @@ static int system_rt(struct device *dev, struct device_route *route, int cmd) if (route->mask) nla_put(msg, RTA_DST, alen, &route->addr); + if (route->sourcemask) + nla_put(msg, RTA_SRC, alen, &route->source); + if (route->metric > 0) nla_put_u32(msg, RTA_PRIORITY, route->metric); @@ -1419,11 +1422,11 @@ out: return ret; } - int system_add_ip_tunnel(const char *name, struct blob_attr *attr) { struct blob_attr *tb[__TUNNEL_ATTR_MAX]; struct blob_attr *cur; + bool set_df = true; const char *str; system_del_ip_tunnel(name); @@ -1435,9 +1438,15 @@ int system_add_ip_tunnel(const char *name, struct blob_attr *attr) return -EINVAL; str = blobmsg_data(cur); + if ((cur = tb[TUNNEL_ATTR_DF])) + set_df = blobmsg_get_bool(cur); + unsigned int ttl = 0; - if ((cur = tb[TUNNEL_ATTR_TTL]) && (ttl = blobmsg_get_u32(cur)) > 255) - return -EINVAL; + if ((cur = tb[TUNNEL_ATTR_TTL])) { + ttl = blobmsg_get_u32(cur); + if (ttl > 255 || (!set_df && ttl)) + return -EINVAL; + } unsigned int link = 0; if ((cur = tb[TUNNEL_ATTR_LINK])) { @@ -1449,14 +1458,13 @@ int system_add_ip_tunnel(const char *name, struct blob_attr *attr) link = iface->l3_dev.dev->ifindex; } - if (!strcmp(str, "sit")) { struct ip_tunnel_parm p = { .link = link, .iph = { .version = 4, .ihl = 5, - .frag_off = htons(IP_DF), + .frag_off = set_df ? htons(IP_DF) : 0, .protocol = IPPROTO_IPV6, .ttl = ttl }