netifd: Fix printf calls + function declarations.
[project/netifd.git] / system-linux.c
index 3e11bdf..f7704cf 100644 (file)
@@ -81,6 +81,9 @@ static struct nl_sock *sock_rtnl = NULL;
 
 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];
 
@@ -705,7 +708,7 @@ int system_bridge_addif(struct device *bridge, struct device *dev)
                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);
        }
 
@@ -992,7 +995,7 @@ static void system_bridge_conf_multicast(struct device *bridge,
                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);
        }
 
@@ -1453,37 +1456,37 @@ system_if_apply_settings(struct device *dev, struct device_settings *s, unsigned
                        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) {
@@ -1988,8 +1991,8 @@ bool system_resolve_rt_proto(const char *type, unsigned int *id)
        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;
@@ -2168,6 +2171,9 @@ static int system_iprule(struct iprule *rule, int cmd)
                        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);
 
@@ -2705,6 +2711,59 @@ failure:
 }
 #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;
@@ -2853,37 +2912,10 @@ int system_add_ip_tunnel(const char *name, struct blob_attr *attr)
                        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 };