]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - net/ipv4/route.c
Merge tag 'microblaze-v5.6-rc1' of git://git.monstr.eu/linux-2.6-microblaze
[linux.git] / net / ipv4 / route.c
index e356ea77922729f45711006926e519c45e552516..ebe7060d0fc92c5dbaca99dd534c24e2d6ff5428 100644 (file)
@@ -237,11 +237,11 @@ static int rt_cache_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &rt_cache_seq_ops);
 }
 
-static const struct file_operations rt_cache_seq_fops = {
-       .open    = rt_cache_seq_open,
-       .read    = seq_read,
-       .llseek  = seq_lseek,
-       .release = seq_release,
+static const struct proc_ops rt_cache_proc_ops = {
+       .proc_open      = rt_cache_seq_open,
+       .proc_read      = seq_read,
+       .proc_lseek     = seq_lseek,
+       .proc_release   = seq_release,
 };
 
 
@@ -328,11 +328,11 @@ static int rt_cpu_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &rt_cpu_seq_ops);
 }
 
-static const struct file_operations rt_cpu_seq_fops = {
-       .open    = rt_cpu_seq_open,
-       .read    = seq_read,
-       .llseek  = seq_lseek,
-       .release = seq_release,
+static const struct proc_ops rt_cpu_proc_ops = {
+       .proc_open      = rt_cpu_seq_open,
+       .proc_read      = seq_read,
+       .proc_lseek     = seq_lseek,
+       .proc_release   = seq_release,
 };
 
 #ifdef CONFIG_IP_ROUTE_CLASSID
@@ -366,12 +366,12 @@ static int __net_init ip_rt_do_proc_init(struct net *net)
        struct proc_dir_entry *pde;
 
        pde = proc_create("rt_cache", 0444, net->proc_net,
-                         &rt_cache_seq_fops);
+                         &rt_cache_proc_ops);
        if (!pde)
                goto err1;
 
        pde = proc_create("rt_cache", 0444,
-                         net->proc_net_stat, &rt_cpu_seq_fops);
+                         net->proc_net_stat, &rt_cpu_proc_ops);
        if (!pde)
                goto err2;
 
@@ -3224,16 +3224,41 @@ 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;
+               fri.offload = 0;
+               fri.trap = 0;
+               if (res.fa_head) {
+                       struct fib_alias *fa;
+
+                       hlist_for_each_entry_rcu(fa, res.fa_head, fa_list) {
+                               u8 slen = 32 - fri.dst_len;
+
+                               if (fa->fa_slen == slen &&
+                                   fa->tb_id == fri.tb_id &&
+                                   fa->fa_tos == fri.tos &&
+                                   fa->fa_info == res.fi &&
+                                   fa->fa_type == fri.type) {
+                                       fri.offload = fa->offload;
+                                       fri.trap = fa->trap;
+                                       break;
+                               }
+                       }
+               }
                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,