Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
[linux-2.6-microblaze.git] / net / ipv4 / fib_semantics.c
index f1888c6..a803cdd 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,15 @@ 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;
+       fri.offload = fa->offload;
+       fri.trap = fa->trap;
+       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 +1732,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 +1746,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))
@@ -1795,6 +1803,11 @@ int fib_dump_info(struct sk_buff *skb, u32 portid, u32 seq, int event,
                        goto nla_put_failure;
        }
 
+       if (fri->offload)
+               rtm->rtm_flags |= RTM_F_OFFLOAD;
+       if (fri->trap)
+               rtm->rtm_flags |= RTM_F_TRAP;
+
        nlmsg_end(skb, nlh);
        return 0;