From 9d32ba169da5a33570d4ab4a96e40b5cec46cd26 Mon Sep 17 00:00:00 2001 From: Hans Dedecker Date: Tue, 19 Nov 2013 12:17:06 +0100 Subject: [PATCH] Tunnel don't fragment bit configurable Make tunnel don't fragment bit configurable via UCI Signed-off-by: Hans Dedecker --- 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, -- 2.30.2