diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /net/ipv4/fib_rules.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'net/ipv4/fib_rules.c')
-rw-r--r-- | net/ipv4/fib_rules.c | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/net/ipv4/fib_rules.c b/net/ipv4/fib_rules.c index 76daeb5ff564..a53bb1b5b118 100644 --- a/net/ipv4/fib_rules.c +++ b/net/ipv4/fib_rules.c | |||
@@ -6,7 +6,7 @@ | |||
6 | * IPv4 Forwarding Information Base: policy rules. | 6 | * IPv4 Forwarding Information Base: policy rules. |
7 | * | 7 | * |
8 | * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> | 8 | * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> |
9 | * Thomas Graf <tgraf@suug.ch> | 9 | * Thomas Graf <tgraf@suug.ch> |
10 | * | 10 | * |
11 | * This program is free software; you can redistribute it and/or | 11 | * This program is free software; you can redistribute it and/or |
12 | * modify it under the terms of the GNU General Public License | 12 | * modify it under the terms of the GNU General Public License |
@@ -14,7 +14,7 @@ | |||
14 | * 2 of the License, or (at your option) any later version. | 14 | * 2 of the License, or (at your option) any later version. |
15 | * | 15 | * |
16 | * Fixes: | 16 | * Fixes: |
17 | * Rani Assaf : local_rule cannot be deleted | 17 | * Rani Assaf : local_rule cannot be deleted |
18 | * Marc Boucher : routing by fwmark | 18 | * Marc Boucher : routing by fwmark |
19 | */ | 19 | */ |
20 | 20 | ||
@@ -32,8 +32,7 @@ | |||
32 | #include <net/ip_fib.h> | 32 | #include <net/ip_fib.h> |
33 | #include <net/fib_rules.h> | 33 | #include <net/fib_rules.h> |
34 | 34 | ||
35 | struct fib4_rule | 35 | struct fib4_rule { |
36 | { | ||
37 | struct fib_rule common; | 36 | struct fib_rule common; |
38 | u8 dst_len; | 37 | u8 dst_len; |
39 | u8 src_len; | 38 | u8 src_len; |
@@ -42,26 +41,27 @@ struct fib4_rule | |||
42 | __be32 srcmask; | 41 | __be32 srcmask; |
43 | __be32 dst; | 42 | __be32 dst; |
44 | __be32 dstmask; | 43 | __be32 dstmask; |
45 | #ifdef CONFIG_NET_CLS_ROUTE | 44 | #ifdef CONFIG_IP_ROUTE_CLASSID |
46 | u32 tclassid; | 45 | u32 tclassid; |
47 | #endif | 46 | #endif |
48 | }; | 47 | }; |
49 | 48 | ||
50 | #ifdef CONFIG_NET_CLS_ROUTE | 49 | #ifdef CONFIG_IP_ROUTE_CLASSID |
51 | u32 fib_rules_tclass(struct fib_result *res) | 50 | u32 fib_rules_tclass(const struct fib_result *res) |
52 | { | 51 | { |
53 | return res->r ? ((struct fib4_rule *) res->r)->tclassid : 0; | 52 | return res->r ? ((struct fib4_rule *) res->r)->tclassid : 0; |
54 | } | 53 | } |
55 | #endif | 54 | #endif |
56 | 55 | ||
57 | int fib_lookup(struct net *net, struct flowi *flp, struct fib_result *res) | 56 | int fib_lookup(struct net *net, struct flowi4 *flp, struct fib_result *res) |
58 | { | 57 | { |
59 | struct fib_lookup_arg arg = { | 58 | struct fib_lookup_arg arg = { |
60 | .result = res, | 59 | .result = res, |
60 | .flags = FIB_LOOKUP_NOREF, | ||
61 | }; | 61 | }; |
62 | int err; | 62 | int err; |
63 | 63 | ||
64 | err = fib_rules_lookup(net->ipv4.rules_ops, flp, 0, &arg); | 64 | err = fib_rules_lookup(net->ipv4.rules_ops, flowi4_to_flowi(flp), 0, &arg); |
65 | res->r = arg.rule; | 65 | res->r = arg.rule; |
66 | 66 | ||
67 | return err; | 67 | return err; |
@@ -91,10 +91,11 @@ static int fib4_rule_action(struct fib_rule *rule, struct flowi *flp, | |||
91 | goto errout; | 91 | goto errout; |
92 | } | 92 | } |
93 | 93 | ||
94 | if ((tbl = fib_get_table(rule->fr_net, rule->table)) == NULL) | 94 | tbl = fib_get_table(rule->fr_net, rule->table); |
95 | if (!tbl) | ||
95 | goto errout; | 96 | goto errout; |
96 | 97 | ||
97 | err = fib_table_lookup(tbl, flp, (struct fib_result *) arg->result); | 98 | err = fib_table_lookup(tbl, &flp->u.ip4, (struct fib_result *) arg->result, arg->flags); |
98 | if (err > 0) | 99 | if (err > 0) |
99 | err = -EAGAIN; | 100 | err = -EAGAIN; |
100 | errout: | 101 | errout: |
@@ -105,14 +106,15 @@ errout: | |||
105 | static int fib4_rule_match(struct fib_rule *rule, struct flowi *fl, int flags) | 106 | static int fib4_rule_match(struct fib_rule *rule, struct flowi *fl, int flags) |
106 | { | 107 | { |
107 | struct fib4_rule *r = (struct fib4_rule *) rule; | 108 | struct fib4_rule *r = (struct fib4_rule *) rule; |
108 | __be32 daddr = fl->fl4_dst; | 109 | struct flowi4 *fl4 = &fl->u.ip4; |
109 | __be32 saddr = fl->fl4_src; | 110 | __be32 daddr = fl4->daddr; |
111 | __be32 saddr = fl4->saddr; | ||
110 | 112 | ||
111 | if (((saddr ^ r->src) & r->srcmask) || | 113 | if (((saddr ^ r->src) & r->srcmask) || |
112 | ((daddr ^ r->dst) & r->dstmask)) | 114 | ((daddr ^ r->dst) & r->dstmask)) |
113 | return 0; | 115 | return 0; |
114 | 116 | ||
115 | if (r->tos && (r->tos != fl->fl4_tos)) | 117 | if (r->tos && (r->tos != fl4->flowi4_tos)) |
116 | return 0; | 118 | return 0; |
117 | 119 | ||
118 | return 1; | 120 | return 1; |
@@ -164,7 +166,7 @@ static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb, | |||
164 | if (frh->dst_len) | 166 | if (frh->dst_len) |
165 | rule4->dst = nla_get_be32(tb[FRA_DST]); | 167 | rule4->dst = nla_get_be32(tb[FRA_DST]); |
166 | 168 | ||
167 | #ifdef CONFIG_NET_CLS_ROUTE | 169 | #ifdef CONFIG_IP_ROUTE_CLASSID |
168 | if (tb[FRA_FLOW]) | 170 | if (tb[FRA_FLOW]) |
169 | rule4->tclassid = nla_get_u32(tb[FRA_FLOW]); | 171 | rule4->tclassid = nla_get_u32(tb[FRA_FLOW]); |
170 | #endif | 172 | #endif |
@@ -194,7 +196,7 @@ static int fib4_rule_compare(struct fib_rule *rule, struct fib_rule_hdr *frh, | |||
194 | if (frh->tos && (rule4->tos != frh->tos)) | 196 | if (frh->tos && (rule4->tos != frh->tos)) |
195 | return 0; | 197 | return 0; |
196 | 198 | ||
197 | #ifdef CONFIG_NET_CLS_ROUTE | 199 | #ifdef CONFIG_IP_ROUTE_CLASSID |
198 | if (tb[FRA_FLOW] && (rule4->tclassid != nla_get_u32(tb[FRA_FLOW]))) | 200 | if (tb[FRA_FLOW] && (rule4->tclassid != nla_get_u32(tb[FRA_FLOW]))) |
199 | return 0; | 201 | return 0; |
200 | #endif | 202 | #endif |
@@ -223,7 +225,7 @@ static int fib4_rule_fill(struct fib_rule *rule, struct sk_buff *skb, | |||
223 | if (rule4->src_len) | 225 | if (rule4->src_len) |
224 | NLA_PUT_BE32(skb, FRA_SRC, rule4->src); | 226 | NLA_PUT_BE32(skb, FRA_SRC, rule4->src); |
225 | 227 | ||
226 | #ifdef CONFIG_NET_CLS_ROUTE | 228 | #ifdef CONFIG_IP_ROUTE_CLASSID |
227 | if (rule4->tclassid) | 229 | if (rule4->tclassid) |
228 | NLA_PUT_U32(skb, FRA_FLOW, rule4->tclassid); | 230 | NLA_PUT_U32(skb, FRA_FLOW, rule4->tclassid); |
229 | #endif | 231 | #endif |