Make tunnel don't fragment bit configurable via UCI

Signed-off-by: Hans Dedecker <dedec...@gmail.com>
---
 system-linux.c |   10 ++++++----
 system.c       |    1 +
 system.h       |    1 +
 3 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/system-linux.c b/system-linux.c
index 58210a6..dae98b0 100644
--- a/system-linux.c
+++ b/system-linux.c
@@ -1418,11 +1418,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);
@@ -1434,10 +1434,13 @@ 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);
-               if (ttl > 255)
+               if (ttl > 255 || (!set_df && ttl))
                        return -EINVAL;
        }
 
@@ -1451,14 +1454,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
                        }
diff --git a/system.c b/system.c
index 1452f05..3dd90b4 100644
--- a/system.c
+++ b/system.c
@@ -20,6 +20,7 @@ static const struct blobmsg_policy 
tunnel_attrs[__TUNNEL_ATTR_MAX] = {
        [TUNNEL_ATTR_LOCAL] = { .name = "local", .type = BLOBMSG_TYPE_STRING },
        [TUNNEL_ATTR_REMOTE] = { .name = "remote", .type = BLOBMSG_TYPE_STRING 
},
        [TUNNEL_ATTR_MTU] = { .name = "mtu", .type = BLOBMSG_TYPE_INT32 },
+       [TUNNEL_ATTR_DF] = { .name = "df", .type = BLOBMSG_TYPE_BOOL },
        [TUNNEL_ATTR_TTL] = { .name = "ttl", .type = BLOBMSG_TYPE_INT32 },
        [TUNNEL_ATTR_6RD_PREFIX] = {.name =  "6rd-prefix", .type = 
BLOBMSG_TYPE_STRING },
        [TUNNEL_ATTR_6RD_RELAY_PREFIX] = { .name = "6rd-relay-prefix", .type = 
BLOBMSG_TYPE_STRING },
diff --git a/system.h b/system.h
index e1d35c9..ff83a1c 100644
--- a/system.h
+++ b/system.h
@@ -26,6 +26,7 @@ enum tunnel_param {
        TUNNEL_ATTR_REMOTE,
        TUNNEL_ATTR_LOCAL,
        TUNNEL_ATTR_MTU,
+       TUNNEL_ATTR_DF,
        TUNNEL_ATTR_TTL,
        TUNNEL_ATTR_6RD_PREFIX,
        TUNNEL_ATTR_6RD_RELAY_PREFIX,
-- 
1.7.1
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to