diff options
Diffstat (limited to 'net/ipv4/fib_rules.c')
-rw-r--r-- | net/ipv4/fib_rules.c | 53 |
1 files changed, 9 insertions, 44 deletions
diff --git a/net/ipv4/fib_rules.c b/net/ipv4/fib_rules.c index 0852b9cd065a..b837c33e0404 100644 --- a/net/ipv4/fib_rules.c +++ b/net/ipv4/fib_rules.c | |||
@@ -44,10 +44,6 @@ struct fib4_rule | |||
44 | __be32 srcmask; | 44 | __be32 srcmask; |
45 | __be32 dst; | 45 | __be32 dst; |
46 | __be32 dstmask; | 46 | __be32 dstmask; |
47 | #ifdef CONFIG_IP_ROUTE_FWMARK | ||
48 | u32 fwmark; | ||
49 | u32 fwmask; | ||
50 | #endif | ||
51 | #ifdef CONFIG_NET_CLS_ROUTE | 47 | #ifdef CONFIG_NET_CLS_ROUTE |
52 | u32 tclassid; | 48 | u32 tclassid; |
53 | #endif | 49 | #endif |
@@ -160,11 +156,6 @@ static int fib4_rule_match(struct fib_rule *rule, struct flowi *fl, int flags) | |||
160 | if (r->tos && (r->tos != fl->fl4_tos)) | 156 | if (r->tos && (r->tos != fl->fl4_tos)) |
161 | return 0; | 157 | return 0; |
162 | 158 | ||
163 | #ifdef CONFIG_IP_ROUTE_FWMARK | ||
164 | if ((r->fwmark ^ fl->fl4_fwmark) & r->fwmask) | ||
165 | return 0; | ||
166 | #endif | ||
167 | |||
168 | return 1; | 159 | return 1; |
169 | } | 160 | } |
170 | 161 | ||
@@ -179,14 +170,10 @@ static struct fib_table *fib_empty_table(void) | |||
179 | } | 170 | } |
180 | 171 | ||
181 | static struct nla_policy fib4_rule_policy[FRA_MAX+1] __read_mostly = { | 172 | static struct nla_policy fib4_rule_policy[FRA_MAX+1] __read_mostly = { |
182 | [FRA_IFNAME] = { .type = NLA_STRING, .len = IFNAMSIZ - 1 }, | 173 | FRA_GENERIC_POLICY, |
183 | [FRA_PRIORITY] = { .type = NLA_U32 }, | ||
184 | [FRA_SRC] = { .type = NLA_U32 }, | 174 | [FRA_SRC] = { .type = NLA_U32 }, |
185 | [FRA_DST] = { .type = NLA_U32 }, | 175 | [FRA_DST] = { .type = NLA_U32 }, |
186 | [FRA_FWMARK] = { .type = NLA_U32 }, | ||
187 | [FRA_FWMASK] = { .type = NLA_U32 }, | ||
188 | [FRA_FLOW] = { .type = NLA_U32 }, | 176 | [FRA_FLOW] = { .type = NLA_U32 }, |
189 | [FRA_TABLE] = { .type = NLA_U32 }, | ||
190 | }; | 177 | }; |
191 | 178 | ||
192 | static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb, | 179 | static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb, |
@@ -220,20 +207,6 @@ static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb, | |||
220 | if (tb[FRA_DST]) | 207 | if (tb[FRA_DST]) |
221 | rule4->dst = nla_get_be32(tb[FRA_DST]); | 208 | rule4->dst = nla_get_be32(tb[FRA_DST]); |
222 | 209 | ||
223 | #ifdef CONFIG_IP_ROUTE_FWMARK | ||
224 | if (tb[FRA_FWMARK]) { | ||
225 | rule4->fwmark = nla_get_u32(tb[FRA_FWMARK]); | ||
226 | if (rule4->fwmark) | ||
227 | /* compatibility: if the mark value is non-zero all bits | ||
228 | * are compared unless a mask is explicitly specified. | ||
229 | */ | ||
230 | rule4->fwmask = 0xFFFFFFFF; | ||
231 | } | ||
232 | |||
233 | if (tb[FRA_FWMASK]) | ||
234 | rule4->fwmask = nla_get_u32(tb[FRA_FWMASK]); | ||
235 | #endif | ||
236 | |||
237 | #ifdef CONFIG_NET_CLS_ROUTE | 210 | #ifdef CONFIG_NET_CLS_ROUTE |
238 | if (tb[FRA_FLOW]) | 211 | if (tb[FRA_FLOW]) |
239 | rule4->tclassid = nla_get_u32(tb[FRA_FLOW]); | 212 | rule4->tclassid = nla_get_u32(tb[FRA_FLOW]); |
@@ -264,14 +237,6 @@ static int fib4_rule_compare(struct fib_rule *rule, struct fib_rule_hdr *frh, | |||
264 | if (frh->tos && (rule4->tos != frh->tos)) | 237 | if (frh->tos && (rule4->tos != frh->tos)) |
265 | return 0; | 238 | return 0; |
266 | 239 | ||
267 | #ifdef CONFIG_IP_ROUTE_FWMARK | ||
268 | if (tb[FRA_FWMARK] && (rule4->fwmark != nla_get_u32(tb[FRA_FWMARK]))) | ||
269 | return 0; | ||
270 | |||
271 | if (tb[FRA_FWMASK] && (rule4->fwmask != nla_get_u32(tb[FRA_FWMASK]))) | ||
272 | return 0; | ||
273 | #endif | ||
274 | |||
275 | #ifdef CONFIG_NET_CLS_ROUTE | 240 | #ifdef CONFIG_NET_CLS_ROUTE |
276 | if (tb[FRA_FLOW] && (rule4->tclassid != nla_get_u32(tb[FRA_FLOW]))) | 241 | if (tb[FRA_FLOW] && (rule4->tclassid != nla_get_u32(tb[FRA_FLOW]))) |
277 | return 0; | 242 | return 0; |
@@ -296,14 +261,6 @@ static int fib4_rule_fill(struct fib_rule *rule, struct sk_buff *skb, | |||
296 | frh->src_len = rule4->src_len; | 261 | frh->src_len = rule4->src_len; |
297 | frh->tos = rule4->tos; | 262 | frh->tos = rule4->tos; |
298 | 263 | ||
299 | #ifdef CONFIG_IP_ROUTE_FWMARK | ||
300 | if (rule4->fwmark) | ||
301 | NLA_PUT_U32(skb, FRA_FWMARK, rule4->fwmark); | ||
302 | |||
303 | if (rule4->fwmask || rule4->fwmark) | ||
304 | NLA_PUT_U32(skb, FRA_FWMASK, rule4->fwmask); | ||
305 | #endif | ||
306 | |||
307 | if (rule4->dst_len) | 264 | if (rule4->dst_len) |
308 | NLA_PUT_BE32(skb, FRA_DST, rule4->dst); | 265 | NLA_PUT_BE32(skb, FRA_DST, rule4->dst); |
309 | 266 | ||
@@ -342,6 +299,13 @@ static u32 fib4_rule_default_pref(void) | |||
342 | return 0; | 299 | return 0; |
343 | } | 300 | } |
344 | 301 | ||
302 | static size_t fib4_rule_nlmsg_payload(struct fib_rule *rule) | ||
303 | { | ||
304 | return nla_total_size(4) /* dst */ | ||
305 | + nla_total_size(4) /* src */ | ||
306 | + nla_total_size(4); /* flow */ | ||
307 | } | ||
308 | |||
345 | static struct fib_rules_ops fib4_rules_ops = { | 309 | static struct fib_rules_ops fib4_rules_ops = { |
346 | .family = AF_INET, | 310 | .family = AF_INET, |
347 | .rule_size = sizeof(struct fib4_rule), | 311 | .rule_size = sizeof(struct fib4_rule), |
@@ -351,6 +315,7 @@ static struct fib_rules_ops fib4_rules_ops = { | |||
351 | .compare = fib4_rule_compare, | 315 | .compare = fib4_rule_compare, |
352 | .fill = fib4_rule_fill, | 316 | .fill = fib4_rule_fill, |
353 | .default_pref = fib4_rule_default_pref, | 317 | .default_pref = fib4_rule_default_pref, |
318 | .nlmsg_payload = fib4_rule_nlmsg_payload, | ||
354 | .nlgroup = RTNLGRP_IPV4_RULE, | 319 | .nlgroup = RTNLGRP_IPV4_RULE, |
355 | .policy = fib4_rule_policy, | 320 | .policy = fib4_rule_policy, |
356 | .rules_list = &fib4_rules, | 321 | .rules_list = &fib4_rules, |