diff options
Diffstat (limited to 'net/core/fib_rules.c')
-rw-r--r-- | net/core/fib_rules.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c index d2c3e7dc2e5f..42e84e08a1be 100644 --- a/net/core/fib_rules.c +++ b/net/core/fib_rules.c | |||
@@ -39,6 +39,24 @@ int fib_default_rule_add(struct fib_rules_ops *ops, | |||
39 | } | 39 | } |
40 | EXPORT_SYMBOL(fib_default_rule_add); | 40 | EXPORT_SYMBOL(fib_default_rule_add); |
41 | 41 | ||
42 | u32 fib_default_rule_pref(struct fib_rules_ops *ops) | ||
43 | { | ||
44 | struct list_head *pos; | ||
45 | struct fib_rule *rule; | ||
46 | |||
47 | if (!list_empty(&ops->rules_list)) { | ||
48 | pos = ops->rules_list.next; | ||
49 | if (pos->next != &ops->rules_list) { | ||
50 | rule = list_entry(pos->next, struct fib_rule, list); | ||
51 | if (rule->pref) | ||
52 | return rule->pref - 1; | ||
53 | } | ||
54 | } | ||
55 | |||
56 | return 0; | ||
57 | } | ||
58 | EXPORT_SYMBOL(fib_default_rule_pref); | ||
59 | |||
42 | static void notify_rule_change(int event, struct fib_rule *rule, | 60 | static void notify_rule_change(int event, struct fib_rule *rule, |
43 | struct fib_rules_ops *ops, struct nlmsghdr *nlh, | 61 | struct fib_rules_ops *ops, struct nlmsghdr *nlh, |
44 | u32 pid); | 62 | u32 pid); |
@@ -104,12 +122,12 @@ errout: | |||
104 | } | 122 | } |
105 | 123 | ||
106 | struct fib_rules_ops * | 124 | struct fib_rules_ops * |
107 | fib_rules_register(struct fib_rules_ops *tmpl, struct net *net) | 125 | fib_rules_register(const struct fib_rules_ops *tmpl, struct net *net) |
108 | { | 126 | { |
109 | struct fib_rules_ops *ops; | 127 | struct fib_rules_ops *ops; |
110 | int err; | 128 | int err; |
111 | 129 | ||
112 | ops = kmemdup(tmpl, sizeof (*ops), GFP_KERNEL); | 130 | ops = kmemdup(tmpl, sizeof(*ops), GFP_KERNEL); |
113 | if (ops == NULL) | 131 | if (ops == NULL) |
114 | return ERR_PTR(-ENOMEM); | 132 | return ERR_PTR(-ENOMEM); |
115 | 133 | ||
@@ -124,7 +142,6 @@ fib_rules_register(struct fib_rules_ops *tmpl, struct net *net) | |||
124 | 142 | ||
125 | return ops; | 143 | return ops; |
126 | } | 144 | } |
127 | |||
128 | EXPORT_SYMBOL_GPL(fib_rules_register); | 145 | EXPORT_SYMBOL_GPL(fib_rules_register); |
129 | 146 | ||
130 | void fib_rules_cleanup_ops(struct fib_rules_ops *ops) | 147 | void fib_rules_cleanup_ops(struct fib_rules_ops *ops) |
@@ -158,7 +175,6 @@ void fib_rules_unregister(struct fib_rules_ops *ops) | |||
158 | 175 | ||
159 | call_rcu(&ops->rcu, fib_rules_put_rcu); | 176 | call_rcu(&ops->rcu, fib_rules_put_rcu); |
160 | } | 177 | } |
161 | |||
162 | EXPORT_SYMBOL_GPL(fib_rules_unregister); | 178 | EXPORT_SYMBOL_GPL(fib_rules_unregister); |
163 | 179 | ||
164 | static int fib_rule_match(struct fib_rule *rule, struct fib_rules_ops *ops, | 180 | static int fib_rule_match(struct fib_rule *rule, struct fib_rules_ops *ops, |
@@ -221,7 +237,6 @@ out: | |||
221 | 237 | ||
222 | return err; | 238 | return err; |
223 | } | 239 | } |
224 | |||
225 | EXPORT_SYMBOL_GPL(fib_rules_lookup); | 240 | EXPORT_SYMBOL_GPL(fib_rules_lookup); |
226 | 241 | ||
227 | static int validate_rulemsg(struct fib_rule_hdr *frh, struct nlattr **tb, | 242 | static int validate_rulemsg(struct fib_rule_hdr *frh, struct nlattr **tb, |
@@ -520,6 +535,7 @@ static int fib_nl_fill_rule(struct sk_buff *skb, struct fib_rule *rule, | |||
520 | return -EMSGSIZE; | 535 | return -EMSGSIZE; |
521 | 536 | ||
522 | frh = nlmsg_data(nlh); | 537 | frh = nlmsg_data(nlh); |
538 | frh->family = ops->family; | ||
523 | frh->table = rule->table; | 539 | frh->table = rule->table; |
524 | NLA_PUT_U32(skb, FRA_TABLE, rule->table); | 540 | NLA_PUT_U32(skb, FRA_TABLE, rule->table); |
525 | frh->res1 = 0; | 541 | frh->res1 = 0; |
@@ -614,7 +630,7 @@ static int fib_nl_dumprule(struct sk_buff *skb, struct netlink_callback *cb) | |||
614 | break; | 630 | break; |
615 | 631 | ||
616 | cb->args[1] = 0; | 632 | cb->args[1] = 0; |
617 | skip: | 633 | skip: |
618 | idx++; | 634 | idx++; |
619 | } | 635 | } |
620 | rcu_read_unlock(); | 636 | rcu_read_unlock(); |
@@ -686,7 +702,6 @@ static int fib_rules_event(struct notifier_block *this, unsigned long event, | |||
686 | struct fib_rules_ops *ops; | 702 | struct fib_rules_ops *ops; |
687 | 703 | ||
688 | ASSERT_RTNL(); | 704 | ASSERT_RTNL(); |
689 | rcu_read_lock(); | ||
690 | 705 | ||
691 | switch (event) { | 706 | switch (event) { |
692 | case NETDEV_REGISTER: | 707 | case NETDEV_REGISTER: |
@@ -700,8 +715,6 @@ static int fib_rules_event(struct notifier_block *this, unsigned long event, | |||
700 | break; | 715 | break; |
701 | } | 716 | } |
702 | 717 | ||
703 | rcu_read_unlock(); | ||
704 | |||
705 | return NOTIFY_DONE; | 718 | return NOTIFY_DONE; |
706 | } | 719 | } |
707 | 720 | ||