if (fd < 0)
return;
- write(fd, val, strlen(val));
+ if (write(fd, val, strlen(val))) {}
close(fd);
}
hdr->nlmsg_type = type;
hdr->nlmsg_flags = NLM_F_REQUEST;
- if (!nl_send_auto_complete(sock_rtnl, clr->msg))
- nl_wait_for_ack(sock_rtnl);
+ nl_socket_disable_auto_ack(sock_rtnl);
+ nl_send_auto_complete(sock_rtnl, clr->msg);
+ nl_socket_enable_auto_ack(sock_rtnl);
return NL_SKIP;
}
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,
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);
if (fd < 0)
continue;
- write(fd, "-1", 2);
+ if (write(fd, "-1", 2)) {}
close(fd);
}
return 0;
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
}