ipv4: Encapsulate function arguments in a struct
authorIdo Schimmel <idosch@mellanox.com>
Tue, 14 Jan 2020 11:23:10 +0000 (13:23 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 15 Jan 2020 02:53:35 +0000 (18:53 -0800)
fib_dump_info() is used to prepare RTM_{NEW,DEL}ROUTE netlink messages
using the passed arguments. Currently, the function takes 11 arguments,
6 of which are attributes of the route being dumped (e.g., prefix, TOS).

The next patch will need the function to also dump to user space an
indication if the route is present in hardware or not. Instead of
passing yet another argument, change the function to take a struct
containing the different route attributes.

v2:
* Name last argument of fib_dump_info()
* Move 'struct fib_rt_info' to include/net/ip_fib.h so that it could
  later be passed to fib_alias_hw_flags_set()

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Reviewed-by: David Ahern <dsahern@gmail.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ip_fib.h
net/ipv4/fib_lookup.h
net/ipv4/fib_semantics.c
net/ipv4/fib_trie.c
net/ipv4/route.c

index b9cba41c6d4f6d3881a3440f25bc85c894010c72..0c071c820e334d4dea1b0e3bf4ae8f8809b2ff07 100644 (file)
@@ -204,6 +204,15 @@ __be32 fib_result_prefsrc(struct net *net, struct fib_result *res);
 #define FIB_RES_DEV(res)       (FIB_RES_NHC(res)->nhc_dev)
 #define FIB_RES_OIF(res)       (FIB_RES_NHC(res)->nhc_oif)
 
+struct fib_rt_info {
+       struct fib_info         *fi;
+       u32                     tb_id;
+       __be32                  dst;
+       int                     dst_len;
+       u8                      tos;
+       u8                      type;
+};
+
 struct fib_entry_notifier_info {
        struct fib_notifier_info info; /* must be first */
        u32 dst;
index a68b5e21ec51e453a90daeb36e8455919403c89d..a4b829358bfa7ad621bd8a88332699907b099270 100644 (file)
@@ -35,9 +35,8 @@ struct fib_info *fib_create_info(struct fib_config *cfg,
 int fib_nh_match(struct fib_config *cfg, struct fib_info *fi,
                 struct netlink_ext_ack *extack);
 bool fib_metrics_match(struct fib_config *cfg, struct fib_info *fi);
-int fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event, u32 tb_id,
-                 u8 type, __be32 dst, int dst_len, u8 tos, struct fib_info *fi,
-                 unsigned int);
+int fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event,
+                 struct fib_rt_info *fri, unsigned int flags);
 void rtmsg_fib(int event, __be32 key, struct fib_alias *fa, int dst_len,
               u32 tb_id, const struct nl_info *info, unsigned int nlm_flags);
 
index f1888c68342631cab0a1c2d23b9a465b7757df75..3ed1349be4284393b63b4d19a7e015e0a648f82c 100644 (file)
@@ -504,6 +504,7 @@ void rtmsg_fib(int event, __be32 key, struct fib_alias *fa,
               int dst_len, u32 tb_id, const struct nl_info *info,
               unsigned int nlm_flags)
 {
+       struct fib_rt_info fri;
        struct sk_buff *skb;
        u32 seq = info->nlh ? info->nlh->nlmsg_seq : 0;
        int err = -ENOBUFS;
@@ -512,9 +513,13 @@ void rtmsg_fib(int event, __be32 key, struct fib_alias *fa,
        if (!skb)
                goto errout;
 
-       err = fib_dump_info(skb, info->portid, seq, event, tb_id,
-                           fa->fa_type, key, dst_len,
-                           fa->fa_tos, fa->fa_info, nlm_flags);
+       fri.fi = fa->fa_info;
+       fri.tb_id = tb_id;
+       fri.dst = key;
+       fri.dst_len = dst_len;
+       fri.tos = fa->fa_tos;
+       fri.type = fa->fa_type;
+       err = fib_dump_info(skb, info->portid, seq, event, &fri, nlm_flags);
        if (err < 0) {
                /* -EMSGSIZE implies BUG in fib_nlmsg_size() */
                WARN_ON(err == -EMSGSIZE);
@@ -1725,10 +1730,11 @@ static int fib_add_multipath(struct sk_buff *skb, struct fib_info *fi)
 #endif
 
 int fib_dump_info(struct sk_buff *skb, u32 portid, u32 seq, int event,
-                 u32 tb_id, u8 type, __be32 dst, int dst_len, u8 tos,
-                 struct fib_info *fi, unsigned int flags)
+                 struct fib_rt_info *fri, unsigned int flags)
 {
-       unsigned int nhs = fib_info_num_path(fi);
+       unsigned int nhs = fib_info_num_path(fri->fi);
+       struct fib_info *fi = fri->fi;
+       u32 tb_id = fri->tb_id;
        struct nlmsghdr *nlh;
        struct rtmsg *rtm;
 
@@ -1738,22 +1744,22 @@ int fib_dump_info(struct sk_buff *skb, u32 portid, u32 seq, int event,
 
        rtm = nlmsg_data(nlh);
        rtm->rtm_family = AF_INET;
-       rtm->rtm_dst_len = dst_len;
+       rtm->rtm_dst_len = fri->dst_len;
        rtm->rtm_src_len = 0;
-       rtm->rtm_tos = tos;
+       rtm->rtm_tos = fri->tos;
        if (tb_id < 256)
                rtm->rtm_table = tb_id;
        else
                rtm->rtm_table = RT_TABLE_COMPAT;
        if (nla_put_u32(skb, RTA_TABLE, tb_id))
                goto nla_put_failure;
-       rtm->rtm_type = type;
+       rtm->rtm_type = fri->type;
        rtm->rtm_flags = fi->fib_flags;
        rtm->rtm_scope = fi->fib_scope;
        rtm->rtm_protocol = fi->fib_protocol;
 
        if (rtm->rtm_dst_len &&
-           nla_put_in_addr(skb, RTA_DST, dst))
+           nla_put_in_addr(skb, RTA_DST, fri->dst))
                goto nla_put_failure;
        if (fi->fib_priority &&
            nla_put_u32(skb, RTA_PRIORITY, fi->fib_priority))
index 39f56d68ec19158f65b52fb8cdd7aaf89c8ae48b..75af3f8ae50e6c0aec514ee64bcb1af40b9c29f9 100644 (file)
@@ -2194,14 +2194,18 @@ static int fn_trie_dump_leaf(struct key_vector *l, struct fib_table *tb,
 
                if (filter->dump_routes) {
                        if (!s_fa) {
+                               struct fib_rt_info fri;
+
+                               fri.fi = fi;
+                               fri.tb_id = tb->tb_id;
+                               fri.dst = xkey;
+                               fri.dst_len = KEYLENGTH - fa->fa_slen;
+                               fri.tos = fa->fa_tos;
+                               fri.type = fa->fa_type;
                                err = fib_dump_info(skb,
                                                    NETLINK_CB(cb->skb).portid,
                                                    cb->nlh->nlmsg_seq,
-                                                   RTM_NEWROUTE,
-                                                   tb->tb_id, fa->fa_type,
-                                                   xkey,
-                                                   KEYLENGTH - fa->fa_slen,
-                                                   fa->fa_tos, fi, flags);
+                                                   RTM_NEWROUTE, &fri, flags);
                                if (err < 0)
                                        goto stop;
                        }
index 87e979f2b74a5fd3b4f3b70250ffd6de4ef6212f..167a7357d12aec00d2401368b2d8e4185be46274 100644 (file)
@@ -3223,16 +3223,22 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
        skb_reset_mac_header(skb);
 
        if (rtm->rtm_flags & RTM_F_FIB_MATCH) {
+               struct fib_rt_info fri;
+
                if (!res.fi) {
                        err = fib_props[res.type].error;
                        if (!err)
                                err = -EHOSTUNREACH;
                        goto errout_rcu;
                }
+               fri.fi = res.fi;
+               fri.tb_id = table_id;
+               fri.dst = res.prefix;
+               fri.dst_len = res.prefixlen;
+               fri.tos = fl4.flowi4_tos;
+               fri.type = rt->rt_type;
                err = fib_dump_info(skb, NETLINK_CB(in_skb).portid,
-                                   nlh->nlmsg_seq, RTM_NEWROUTE, table_id,
-                                   rt->rt_type, res.prefix, res.prefixlen,
-                                   fl4.flowi4_tos, res.fi, 0);
+                                   nlh->nlmsg_seq, RTM_NEWROUTE, &fri, 0);
        } else {
                err = rt_fill_info(net, dst, src, rt, table_id, &fl4, skb,
                                   NETLINK_CB(in_skb).portid,