]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - net/ipv4/fib_frontend.c
ipv4: Export rtm_ipv4_policy.
[karo-tx-linux.git] / net / ipv4 / fib_frontend.c
index 83e3ed258467dbfd620bd27d48a0b33f5ef7a067..1b5860f5b9d75a33681273c0aa758b71a732e815 100644 (file)
@@ -588,13 +588,15 @@ int ip_rt_ioctl(struct net *net, unsigned int cmd, void __user *arg)
                        if (cmd == SIOCDELRT) {
                                tb = fib_get_table(net, cfg.fc_table);
                                if (tb)
-                                       err = fib_table_delete(net, tb, &cfg);
+                                       err = fib_table_delete(net, tb, &cfg,
+                                                              NULL);
                                else
                                        err = -ESRCH;
                        } else {
                                tb = fib_new_table(net, cfg.fc_table);
                                if (tb)
-                                       err = fib_table_insert(net, tb, &cfg);
+                                       err = fib_table_insert(net, tb,
+                                                              &cfg, NULL);
                                else
                                        err = -ENOBUFS;
                        }
@@ -624,16 +626,18 @@ const struct nla_policy rtm_ipv4_policy[RTA_MAX + 1] = {
        [RTA_UID]               = { .type = NLA_U32 },
        [RTA_MARK]              = { .type = NLA_U32 },
 };
+EXPORT_SYMBOL_GPL(rtm_ipv4_policy);
 
 static int rtm_to_fib_config(struct net *net, struct sk_buff *skb,
-                            struct nlmsghdr *nlh, struct fib_config *cfg)
+                            struct nlmsghdr *nlh, struct fib_config *cfg,
+                            struct netlink_ext_ack *extack)
 {
        struct nlattr *attr;
        int err, remaining;
        struct rtmsg *rtm;
 
        err = nlmsg_validate(nlh, sizeof(*rtm), RTA_MAX, rtm_ipv4_policy,
-                            NULL);
+                            extack);
        if (err < 0)
                goto errout;
 
@@ -654,6 +658,7 @@ static int rtm_to_fib_config(struct net *net, struct sk_buff *skb,
        cfg->fc_nlinfo.nl_net = net;
 
        if (cfg->fc_type > RTN_MAX) {
+               NL_SET_ERR_MSG(extack, "Invalid route type");
                err = -EINVAL;
                goto errout;
        }
@@ -681,7 +686,8 @@ static int rtm_to_fib_config(struct net *net, struct sk_buff *skb,
                        break;
                case RTA_MULTIPATH:
                        err = lwtunnel_valid_encap_type_attr(nla_data(attr),
-                                                            nla_len(attr));
+                                                            nla_len(attr),
+                                                            extack);
                        if (err < 0)
                                goto errout;
                        cfg->fc_mp = nla_data(attr);
@@ -698,7 +704,8 @@ static int rtm_to_fib_config(struct net *net, struct sk_buff *skb,
                        break;
                case RTA_ENCAP_TYPE:
                        cfg->fc_encap_type = nla_get_u16(attr);
-                       err = lwtunnel_valid_encap_type(cfg->fc_encap_type);
+                       err = lwtunnel_valid_encap_type(cfg->fc_encap_type,
+                                                       extack);
                        if (err < 0)
                                goto errout;
                        break;
@@ -718,17 +725,18 @@ static int inet_rtm_delroute(struct sk_buff *skb, struct nlmsghdr *nlh,
        struct fib_table *tb;
        int err;
 
-       err = rtm_to_fib_config(net, skb, nlh, &cfg);
+       err = rtm_to_fib_config(net, skb, nlh, &cfg, extack);
        if (err < 0)
                goto errout;
 
        tb = fib_get_table(net, cfg.fc_table);
        if (!tb) {
+               NL_SET_ERR_MSG(extack, "FIB table does not exist");
                err = -ESRCH;
                goto errout;
        }
 
-       err = fib_table_delete(net, tb, &cfg);
+       err = fib_table_delete(net, tb, &cfg, extack);
 errout:
        return err;
 }
@@ -741,7 +749,7 @@ static int inet_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh,
        struct fib_table *tb;
        int err;
 
-       err = rtm_to_fib_config(net, skb, nlh, &cfg);
+       err = rtm_to_fib_config(net, skb, nlh, &cfg, extack);
        if (err < 0)
                goto errout;
 
@@ -751,7 +759,7 @@ static int inet_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh,
                goto errout;
        }
 
-       err = fib_table_insert(net, tb, &cfg);
+       err = fib_table_insert(net, tb, &cfg, extack);
 errout:
        return err;
 }
@@ -845,9 +853,9 @@ static void fib_magic(int cmd, int type, __be32 dst, int dst_len, struct in_ifad
                cfg.fc_scope = RT_SCOPE_HOST;
 
        if (cmd == RTM_NEWROUTE)
-               fib_table_insert(net, tb, &cfg);
+               fib_table_insert(net, tb, &cfg, NULL);
        else
-               fib_table_delete(net, tb, &cfg);
+               fib_table_delete(net, tb, &cfg, NULL);
 }
 
 void fib_add_ifaddr(struct in_ifaddr *ifa)