gss_krb5: add remaining pieces to enable AES encryption support
[safe/jmp/linux-2.6] / net / ipv4 / fib_hash.c
index 02088de..4ed7e0d 100644 (file)
@@ -5,8 +5,6 @@
  *
  *             IPv4 FIB: lookup engine and maintenance routines.
  *
- * Version:    $Id: fib_hash.c,v 1.13 2001/10/31 21:55:54 davem Exp $
- *
  * Authors:    Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
  *
  *             This program is free software; you can redistribute it and/or
@@ -34,6 +32,7 @@
 #include <linux/skbuff.h>
 #include <linux/netlink.h>
 #include <linux/init.h>
+#include <linux/slab.h>
 
 #include <net/net_namespace.h>
 #include <net/ip.h>
@@ -244,12 +243,12 @@ fn_new_zone(struct fn_hash *table, int z)
        return fz;
 }
 
-static int
-fn_hash_lookup(struct fib_table *tb, const struct flowi *flp, struct fib_result *res)
+int fib_table_lookup(struct fib_table *tb,
+                    const struct flowi *flp, struct fib_result *res)
 {
        int err;
        struct fn_zone *fz;
-       struct fn_hash *t = (struct fn_hash*)tb->tb_data;
+       struct fn_hash *t = (struct fn_hash *)tb->tb_data;
 
        read_lock(&fib_hash_lock);
        for (fz = t->fn_zone_list; fz; fz = fz->fz_next) {
@@ -265,7 +264,6 @@ fn_hash_lookup(struct fib_table *tb, const struct flowi *flp, struct fib_result
 
                        err = fib_semantic_match(&f->fn_alias,
                                                 flp, res,
-                                                f->fn_key, fz->fz_mask,
                                                 fz->fz_order);
                        if (err <= 0)
                                goto out;
@@ -277,15 +275,15 @@ out:
        return err;
 }
 
-static void
-fn_hash_select_default(struct fib_table *tb, const struct flowi *flp, struct fib_result *res)
+void fib_table_select_default(struct fib_table *tb,
+                             const struct flowi *flp, struct fib_result *res)
 {
        int order, last_idx;
        struct hlist_node *node;
        struct fib_node *f;
        struct fib_info *fi = NULL;
        struct fib_info *last_resort;
-       struct fn_hash *t = (struct fn_hash*)tb->tb_data;
+       struct fn_hash *t = (struct fn_hash *)tb->tb_data;
        struct fn_zone *fz = t->fn_zones[0];
 
        if (fz == NULL)
@@ -369,7 +367,7 @@ static struct fib_node *fib_find_node(struct fn_zone *fz, __be32 key)
        return NULL;
 }
 
-static int fn_hash_insert(struct fib_table *tb, struct fib_config *cfg)
+int fib_table_insert(struct fib_table *tb, struct fib_config *cfg)
 {
        struct fn_hash *table = (struct fn_hash *) tb->tb_data;
        struct fib_node *new_f = NULL;
@@ -474,7 +472,7 @@ static int fn_hash_insert(struct fib_table *tb, struct fib_config *cfg)
 
                        fib_release_info(fi_drop);
                        if (state & FA_S_ACCESSED)
-                               rt_cache_flush(-1);
+                               rt_cache_flush(cfg->fc_nlinfo.nl_net, -1);
                        rtmsg_fib(RTM_NEWROUTE, key, fa, cfg->fc_dst_len, tb->tb_id,
                                  &cfg->fc_nlinfo, NLM_F_REPLACE);
                        return 0;
@@ -534,7 +532,7 @@ static int fn_hash_insert(struct fib_table *tb, struct fib_config *cfg)
 
        if (new_f)
                fz->fz_nent++;
-       rt_cache_flush(-1);
+       rt_cache_flush(cfg->fc_nlinfo.nl_net, -1);
 
        rtmsg_fib(RTM_NEWROUTE, key, new_fa, cfg->fc_dst_len, tb->tb_id,
                  &cfg->fc_nlinfo, 0);
@@ -547,10 +545,9 @@ out:
        return err;
 }
 
-
-static int fn_hash_delete(struct fib_table *tb, struct fib_config *cfg)
+int fib_table_delete(struct fib_table *tb, struct fib_config *cfg)
 {
-       struct fn_hash *table = (struct fn_hash*)tb->tb_data;
+       struct fn_hash *table = (struct fn_hash *)tb->tb_data;
        struct fib_node *f;
        struct fib_alias *fa, *fa_to_delete;
        struct fn_zone *fz;
@@ -616,7 +613,7 @@ static int fn_hash_delete(struct fib_table *tb, struct fib_config *cfg)
                write_unlock_bh(&fib_hash_lock);
 
                if (fa->fa_state & FA_S_ACCESSED)
-                       rt_cache_flush(-1);
+                       rt_cache_flush(cfg->fc_nlinfo.nl_net, -1);
                fn_free_alias(fa, f);
                if (kill_fn) {
                        fn_free_node(f);
@@ -665,7 +662,7 @@ static int fn_flush_list(struct fn_zone *fz, int idx)
        return found;
 }
 
-static int fn_hash_flush(struct fib_table *tb)
+int fib_table_flush(struct fib_table *tb)
 {
        struct fn_hash *table = (struct fn_hash *) tb->tb_data;
        struct fn_zone *fz;
@@ -746,11 +743,12 @@ fn_hash_dump_zone(struct sk_buff *skb, struct netlink_callback *cb,
        return skb->len;
 }
 
-static int fn_hash_dump(struct fib_table *tb, struct sk_buff *skb, struct netlink_callback *cb)
+int fib_table_dump(struct fib_table *tb, struct sk_buff *skb,
+                  struct netlink_callback *cb)
 {
        int m, s_m;
        struct fn_zone *fz;
-       struct fn_hash *table = (struct fn_hash*)tb->tb_data;
+       struct fn_hash *table = (struct fn_hash *)tb->tb_data;
 
        s_m = cb->args[2];
        read_lock(&fib_hash_lock);
@@ -790,12 +788,7 @@ struct fib_table *fib_hash_table(u32 id)
 
        tb->tb_id = id;
        tb->tb_default = -1;
-       tb->tb_lookup = fn_hash_lookup;
-       tb->tb_insert = fn_hash_insert;
-       tb->tb_delete = fn_hash_delete;
-       tb->tb_flush = fn_hash_flush;
-       tb->tb_select_default = fn_hash_select_default;
-       tb->tb_dump = fn_hash_dump;
+
        memset(tb->tb_data, 0, sizeof(struct fn_hash));
        return tb;
 }
@@ -847,10 +840,10 @@ static struct fib_alias *fib_get_first(struct seq_file *seq)
                        struct hlist_node *node;
                        struct fib_node *fn;
 
-                       hlist_for_each_entry(fn,node,iter->hash_head,fn_hash) {
+                       hlist_for_each_entry(fn, node, iter->hash_head, fn_hash) {
                                struct fib_alias *fa;
 
-                               list_for_each_entry(fa,&fn->fn_alias,fa_list) {
+                               list_for_each_entry(fa, &fn->fn_alias, fa_list) {
                                        iter->fn = fn;
                                        iter->fa = fa;
                                        goto out;
@@ -1003,7 +996,7 @@ static unsigned fib_flag_trans(int type, __be32 mask, struct fib_info *fi)
 static int fib_seq_show(struct seq_file *seq, void *v)
 {
        struct fib_iter_state *iter;
-       char bf[128];
+       int len;
        __be32 prefix, mask;
        unsigned flags;
        struct fib_node *f;
@@ -1025,18 +1018,19 @@ static int fib_seq_show(struct seq_file *seq, void *v)
        mask    = FZ_MASK(iter->zone);
        flags   = fib_flag_trans(fa->fa_type, mask, fi);
        if (fi)
-               snprintf(bf, sizeof(bf),
-                        "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u",
+               seq_printf(seq,
+                        "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n",
                         fi->fib_dev ? fi->fib_dev->name : "*", prefix,
                         fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority,
                         mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0),
                         fi->fib_window,
-                        fi->fib_rtt >> 3);
+                        fi->fib_rtt >> 3, &len);
        else
-               snprintf(bf, sizeof(bf),
-                        "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u",
-                        prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0);
-       seq_printf(seq, "%-127s\n", bf);
+               seq_printf(seq,
+                        "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n",
+                        prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len);
+
+       seq_printf(seq, "%*s\n", 127 - len, "");
 out:
        return 0;
 }