#define RTN_FAILED_POLICY 12
#endif
-#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <glob.h>
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);
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])) {
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
}