static int cb_rtnl_event(struct nl_msg *msg, void *arg);
static void handle_hotplug_event(struct uloop_fd *u, unsigned int events);
+static int system_add_proto_tunnel(const char *name, const uint8_t proto,
+ const unsigned int link, struct blob_attr **tb);
+static int __system_del_ip_tunnel(const char *name, struct blob_attr **tb);
static char dev_buf[256];
system_bridge_set_wireless(bridge, dev);
if (dev->settings.flags & DEV_OPT_MULTICAST_ROUTER) {
- snprintf(buf, sizeof(buf), "%i", dev->settings.multicast_router);
+ snprintf(buf, sizeof(buf), "%u", dev->settings.multicast_router);
system_bridge_set_multicast_router(dev, buf, false);
}
bridge->ifname, buf);
if (bridge->settings.flags & DEV_OPT_MULTICAST_ROUTER) {
- snprintf(buf, buf_len, "%i", bridge->settings.multicast_router);
+ snprintf(buf, buf_len, "%u", bridge->settings.multicast_router);
system_bridge_set_multicast_router(bridge, buf, true);
}
s->flags &= ~DEV_OPT_PROMISC;
}
if (s->flags & DEV_OPT_RPFILTER & apply_mask) {
- snprintf(buf, sizeof(buf), "%d", s->rpfilter);
+ snprintf(buf, sizeof(buf), "%u", s->rpfilter);
system_set_rpfilter(dev, buf);
}
if (s->flags & DEV_OPT_ACCEPTLOCAL & apply_mask)
system_set_acceptlocal(dev, s->acceptlocal ? "1" : "0");
if (s->flags & DEV_OPT_IGMPVERSION & apply_mask) {
- snprintf(buf, sizeof(buf), "%d", s->igmpversion);
+ snprintf(buf, sizeof(buf), "%u", s->igmpversion);
system_set_igmpversion(dev, buf);
}
if (s->flags & DEV_OPT_MLDVERSION & apply_mask) {
- snprintf(buf, sizeof(buf), "%d", s->mldversion);
+ snprintf(buf, sizeof(buf), "%u", s->mldversion);
system_set_mldversion(dev, buf);
}
if (s->flags & DEV_OPT_NEIGHREACHABLETIME & apply_mask) {
- snprintf(buf, sizeof(buf), "%d", s->neigh4reachabletime);
+ snprintf(buf, sizeof(buf), "%u", s->neigh4reachabletime);
system_set_neigh4reachabletime(dev, buf);
- snprintf(buf, sizeof(buf), "%d", s->neigh6reachabletime);
+ snprintf(buf, sizeof(buf), "%u", s->neigh6reachabletime);
system_set_neigh6reachabletime(dev, buf);
}
if (s->flags & DEV_OPT_NEIGHLOCKTIME & apply_mask) {
- snprintf(buf, sizeof(buf), "%d", s->neigh4locktime);
+ snprintf(buf, sizeof(buf), "%u", s->neigh4locktime);
system_set_neigh4locktime(dev, buf);
}
if (s->flags & DEV_OPT_NEIGHGCSTALETIME & apply_mask) {
- snprintf(buf, sizeof(buf), "%d", s->neigh4gcstaletime);
+ snprintf(buf, sizeof(buf), "%u", s->neigh4gcstaletime);
system_set_neigh4gcstaletime(dev, buf);
- snprintf(buf, sizeof(buf), "%d", s->neigh6gcstaletime);
+ snprintf(buf, sizeof(buf), "%u", s->neigh6gcstaletime);
system_set_neigh6gcstaletime(dev, buf);
}
if (s->flags & DEV_OPT_DADTRANSMITS & apply_mask) {
- snprintf(buf, sizeof(buf), "%d", s->dadtransmits);
+ snprintf(buf, sizeof(buf), "%u", s->dadtransmits);
system_set_dadtransmits(dev, buf);
}
if (s->flags & DEV_OPT_MULTICAST & apply_mask) {
FILE *f;
char *e, buf[128];
unsigned int n, proto = 256;
-
- if ((n = strtoul(type, &e, 0)) >= 0 && !*e && e != type)
+ n = strtoul(type, &e, 0);
+ if (!*e && e != type)
proto = n;
else if (!strcmp(type, "unspec"))
proto = RTPROT_UNSPEC;
nla_put_u32(msg, FRA_TABLE, rule->lookup);
}
+ if (rule->flags & IPRULE_SUP_PREFIXLEN)
+ nla_put_u32(msg, FRA_SUPPRESS_PREFIXLEN, rule->sup_prefixlen);
+
if (rule->flags & IPRULE_GOTO)
nla_put_u32(msg, FRA_GOTO, rule->gotoid);
}
#endif
+static int system_add_sit_tunnel(const char *name, const unsigned int link, struct blob_attr **tb)
+{
+ struct blob_attr *cur;
+ int ret = 0;
+
+ if (system_add_proto_tunnel(name, IPPROTO_IPV6, link, tb) < 0)
+ return -1;
+
+#ifdef SIOCADD6RD
+ if ((cur = tb[TUNNEL_ATTR_DATA])) {
+ struct blob_attr *tb_data[__SIXRD_DATA_ATTR_MAX];
+ unsigned int mask;
+ struct ip_tunnel_6rd p6;
+
+ blobmsg_parse(sixrd_data_attr_list.params, __SIXRD_DATA_ATTR_MAX, tb_data,
+ blobmsg_data(cur), blobmsg_len(cur));
+
+ memset(&p6, 0, sizeof(p6));
+
+ if ((cur = tb_data[SIXRD_DATA_PREFIX])) {
+ if (!parse_ip_and_netmask(AF_INET6, blobmsg_data(cur),
+ &p6.prefix, &mask) || mask > 128) {
+ ret = -EINVAL;
+ goto failure;
+ }
+
+ p6.prefixlen = mask;
+ }
+
+ if ((cur = tb_data[SIXRD_DATA_RELAY_PREFIX])) {
+ if (!parse_ip_and_netmask(AF_INET, blobmsg_data(cur),
+ &p6.relay_prefix, &mask) || mask > 32) {
+ ret = -EINVAL;
+ goto failure;
+ }
+
+ p6.relay_prefixlen = mask;
+ }
+
+ if (tunnel_ioctl(name, SIOCADD6RD, &p6) < 0) {
+ ret = -1;
+ goto failure;
+ }
+ }
+#endif
+
+ return ret;
+
+failure:
+ __system_del_ip_tunnel(name, tb);
+ return ret;
+}
+
static int system_add_proto_tunnel(const char *name, const uint8_t proto, const unsigned int link, struct blob_attr **tb)
{
struct blob_attr *cur;
link = iface->l3_dev.dev->ifindex;
}
- if (!strcmp(str, "sit")) {
- if (system_add_proto_tunnel(name, IPPROTO_IPV6, link, tb) < 0)
- return -1;
-
-#ifdef SIOCADD6RD
- if ((cur = tb[TUNNEL_ATTR_6RD_PREFIX])) {
- unsigned int mask;
- struct ip_tunnel_6rd p6;
-
- memset(&p6, 0, sizeof(p6));
-
- if (!parse_ip_and_netmask(AF_INET6, blobmsg_data(cur),
- &p6.prefix, &mask) || mask > 128)
- return -EINVAL;
- p6.prefixlen = mask;
-
- if ((cur = tb[TUNNEL_ATTR_6RD_RELAY_PREFIX])) {
- if (!parse_ip_and_netmask(AF_INET, blobmsg_data(cur),
- &p6.relay_prefix, &mask) || mask > 32)
- return -EINVAL;
- p6.relay_prefixlen = mask;
- }
-
- if (tunnel_ioctl(name, SIOCADD6RD, &p6) < 0) {
- __system_del_ip_tunnel(name, tb);
- return -1;
- }
- }
-#endif
+ if (!strcmp(str, "sit"))
+ return system_add_sit_tunnel(name, link, tb);
#ifdef IFLA_IPTUN_MAX
- } else if (!strcmp(str, "ipip6")) {
+ else if (!strcmp(str, "ipip6")) {
struct nl_msg *nlm = nlmsg_alloc_simple(RTM_NEWLINK,
NLM_F_REQUEST | NLM_F_REPLACE | NLM_F_CREATE);
struct ifinfomsg ifi = { .ifi_family = AF_UNSPEC };