Skip to content

Commit 47dcf0c

Browse files
tgrafDavid S. Miller
authored andcommitted
[NET]: Rethink mark field in struct flowi
Now that all protocols have been made aware of the mark field it can be moved out of the union thus simplyfing its usage. The config options in the IPv4/IPv6/DECnet subsystems to enable respectively disable mark based routing only obfuscate the code with ifdefs, the cost for the additional comparison in the flow key is insignificant, and most distributions have all these options enabled by default anyway. Therefore it makes sense to remove the config options and enable mark based routing by default. Signed-off-by: Thomas Graf <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 82e91ff commit 47dcf0c

File tree

14 files changed

+26
-121
lines changed

14 files changed

+26
-121
lines changed

include/net/flow.h

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,41 +13,36 @@
1313
struct flowi {
1414
int oif;
1515
int iif;
16+
__u32 mark;
1617

1718
union {
1819
struct {
1920
__be32 daddr;
2021
__be32 saddr;
21-
__u32 fwmark;
2222
__u8 tos;
2323
__u8 scope;
2424
} ip4_u;
2525

2626
struct {
2727
struct in6_addr daddr;
2828
struct in6_addr saddr;
29-
__u32 fwmark;
3029
__be32 flowlabel;
3130
} ip6_u;
3231

3332
struct {
3433
__le16 daddr;
3534
__le16 saddr;
36-
__u32 fwmark;
3735
__u8 scope;
3836
} dn_u;
3937
} nl_u;
4038
#define fld_dst nl_u.dn_u.daddr
4139
#define fld_src nl_u.dn_u.saddr
42-
#define fld_fwmark nl_u.dn_u.fwmark
4340
#define fld_scope nl_u.dn_u.scope
4441
#define fl6_dst nl_u.ip6_u.daddr
4542
#define fl6_src nl_u.ip6_u.saddr
46-
#define fl6_fwmark nl_u.ip6_u.fwmark
4743
#define fl6_flowlabel nl_u.ip6_u.flowlabel
4844
#define fl4_dst nl_u.ip4_u.daddr
4945
#define fl4_src nl_u.ip4_u.saddr
50-
#define fl4_fwmark nl_u.ip4_u.fwmark
5146
#define fl4_tos nl_u.ip4_u.tos
5247
#define fl4_scope nl_u.ip4_u.scope
5348

include/net/ip_mp_alg.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,7 @@ static inline int multipath_comparekeys(const struct flowi *flp1,
8888
return flp1->fl4_dst == flp2->fl4_dst &&
8989
flp1->fl4_src == flp2->fl4_src &&
9090
flp1->oif == flp2->oif &&
91-
#ifdef CONFIG_IP_ROUTE_FWMARK
92-
flp1->fl4_fwmark == flp2->fl4_fwmark &&
93-
#endif
91+
flp1->mark == flp2->mark &&
9492
!((flp1->fl4_tos ^ flp2->fl4_tos) &
9593
(IPTOS_RT_MASK | RTO_ONLINK));
9694
}

net/decnet/Kconfig

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,3 @@ config DECNET_ROUTER
4141

4242
See <file:Documentation/networking/decnet.txt> for more information.
4343

44-
config DECNET_ROUTE_FWMARK
45-
bool "DECnet: use FWMARK value as routing key (EXPERIMENTAL)"
46-
depends on DECNET_ROUTER && NETFILTER
47-
help
48-
If you say Y here, you will be able to specify different routes for
49-
packets with different FWMARK ("firewalling mark") values
50-
(see ipchains(8), "-m" argument).
51-

net/decnet/dn_route.c

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -269,9 +269,7 @@ static inline int compare_keys(struct flowi *fl1, struct flowi *fl2)
269269
{
270270
return ((fl1->nl_u.dn_u.daddr ^ fl2->nl_u.dn_u.daddr) |
271271
(fl1->nl_u.dn_u.saddr ^ fl2->nl_u.dn_u.saddr) |
272-
#ifdef CONFIG_DECNET_ROUTE_FWMARK
273-
(fl1->nl_u.dn_u.fwmark ^ fl2->nl_u.dn_u.fwmark) |
274-
#endif
272+
(fl1->mark ^ fl2->mark) |
275273
(fl1->nl_u.dn_u.scope ^ fl2->nl_u.dn_u.scope) |
276274
(fl1->oif ^ fl2->oif) |
277275
(fl1->iif ^ fl2->iif)) == 0;
@@ -882,10 +880,8 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old
882880
{ .daddr = oldflp->fld_dst,
883881
.saddr = oldflp->fld_src,
884882
.scope = RT_SCOPE_UNIVERSE,
885-
#ifdef CONFIG_DECNET_ROUTE_FWMARK
886-
.fwmark = oldflp->fld_fwmark
887-
#endif
888883
} },
884+
.mark = oldflp->mark,
889885
.iif = loopback_dev.ifindex,
890886
.oif = oldflp->oif };
891887
struct dn_route *rt = NULL;
@@ -903,7 +899,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old
903899
"dn_route_output_slow: dst=%04x src=%04x mark=%d"
904900
" iif=%d oif=%d\n", dn_ntohs(oldflp->fld_dst),
905901
dn_ntohs(oldflp->fld_src),
906-
oldflp->fld_fwmark, loopback_dev.ifindex, oldflp->oif);
902+
oldflp->mark, loopback_dev.ifindex, oldflp->oif);
907903

908904
/* If we have an output interface, verify its a DECnet device */
909905
if (oldflp->oif) {
@@ -1108,9 +1104,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old
11081104
rt->fl.fld_dst = oldflp->fld_dst;
11091105
rt->fl.oif = oldflp->oif;
11101106
rt->fl.iif = 0;
1111-
#ifdef CONFIG_DECNET_ROUTE_FWMARK
1112-
rt->fl.fld_fwmark = oldflp->fld_fwmark;
1113-
#endif
1107+
rt->fl.mark = oldflp->mark;
11141108

11151109
rt->rt_saddr = fl.fld_src;
11161110
rt->rt_daddr = fl.fld_dst;
@@ -1178,9 +1172,7 @@ static int __dn_route_output_key(struct dst_entry **pprt, const struct flowi *fl
11781172
rt = rcu_dereference(rt->u.rt_next)) {
11791173
if ((flp->fld_dst == rt->fl.fld_dst) &&
11801174
(flp->fld_src == rt->fl.fld_src) &&
1181-
#ifdef CONFIG_DECNET_ROUTE_FWMARK
1182-
(flp->fld_fwmark == rt->fl.fld_fwmark) &&
1183-
#endif
1175+
(flp->mark == rt->fl.mark) &&
11841176
(rt->fl.iif == 0) &&
11851177
(rt->fl.oif == flp->oif)) {
11861178
rt->u.dst.lastuse = jiffies;
@@ -1235,10 +1227,8 @@ static int dn_route_input_slow(struct sk_buff *skb)
12351227
{ .daddr = cb->dst,
12361228
.saddr = cb->src,
12371229
.scope = RT_SCOPE_UNIVERSE,
1238-
#ifdef CONFIG_DECNET_ROUTE_FWMARK
1239-
.fwmark = skb->mark
1240-
#endif
12411230
} },
1231+
.mark = skb->mark,
12421232
.iif = skb->dev->ifindex };
12431233
struct dn_fib_res res = { .fi = NULL, .type = RTN_UNREACHABLE };
12441234
int err = -EINVAL;
@@ -1385,7 +1375,7 @@ static int dn_route_input_slow(struct sk_buff *skb)
13851375
rt->fl.fld_dst = cb->dst;
13861376
rt->fl.oif = 0;
13871377
rt->fl.iif = in_dev->ifindex;
1388-
rt->fl.fld_fwmark = fl.fld_fwmark;
1378+
rt->fl.mark = fl.mark;
13891379

13901380
rt->u.dst.flags = DST_HOST;
13911381
rt->u.dst.neighbour = neigh;
@@ -1457,9 +1447,7 @@ int dn_route_input(struct sk_buff *skb)
14571447
if ((rt->fl.fld_src == cb->src) &&
14581448
(rt->fl.fld_dst == cb->dst) &&
14591449
(rt->fl.oif == 0) &&
1460-
#ifdef CONFIG_DECNET_ROUTE_FWMARK
1461-
(rt->fl.fld_fwmark == skb->mark) &&
1462-
#endif
1450+
(rt->fl.mark == skb->mark) &&
14631451
(rt->fl.iif == cb->iif)) {
14641452
rt->u.dst.lastuse = jiffies;
14651453
dst_hold(&rt->u.dst);

net/decnet/dn_rules.c

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,8 @@ struct dn_fib_rule
4545
__le16 dstmask;
4646
__le16 srcmap;
4747
u8 flags;
48-
#ifdef CONFIG_DECNET_ROUTE_FWMARK
4948
u32 fwmark;
5049
u32 fwmask;
51-
#endif
5250
};
5351

5452
static struct dn_fib_rule default_rule = {
@@ -131,10 +129,8 @@ static int dn_fib_rule_match(struct fib_rule *rule, struct flowi *fl, int flags)
131129
((daddr ^ r->dst) & r->dstmask))
132130
return 0;
133131

134-
#ifdef CONFIG_DECNET_ROUTE_FWMARK
135-
if ((r->fwmark ^ fl->fld_fwmark) & r->fwmask)
132+
if ((r->fwmark ^ fl->mark) & r->fwmask)
136133
return 0;
137-
#endif
138134

139135
return 1;
140136
}
@@ -169,7 +165,6 @@ static int dn_fib_rule_configure(struct fib_rule *rule, struct sk_buff *skb,
169165
if (tb[FRA_DST])
170166
r->dst = nla_get_u16(tb[FRA_DST]);
171167

172-
#ifdef CONFIG_DECNET_ROUTE_FWMARK
173168
if (tb[FRA_FWMARK]) {
174169
r->fwmark = nla_get_u32(tb[FRA_FWMARK]);
175170
if (r->fwmark)
@@ -181,7 +176,6 @@ static int dn_fib_rule_configure(struct fib_rule *rule, struct sk_buff *skb,
181176

182177
if (tb[FRA_FWMASK])
183178
r->fwmask = nla_get_u32(tb[FRA_FWMASK]);
184-
#endif
185179

186180
r->src_len = frh->src_len;
187181
r->srcmask = dnet_make_mask(r->src_len);
@@ -203,13 +197,11 @@ static int dn_fib_rule_compare(struct fib_rule *rule, struct fib_rule_hdr *frh,
203197
if (frh->dst_len && (r->dst_len != frh->dst_len))
204198
return 0;
205199

206-
#ifdef CONFIG_DECNET_ROUTE_FWMARK
207200
if (tb[FRA_FWMARK] && (r->fwmark != nla_get_u32(tb[FRA_FWMARK])))
208201
return 0;
209202

210203
if (tb[FRA_FWMASK] && (r->fwmask != nla_get_u32(tb[FRA_FWMASK])))
211204
return 0;
212-
#endif
213205

214206
if (tb[FRA_SRC] && (r->src != nla_get_u16(tb[FRA_SRC])))
215207
return 0;
@@ -248,12 +240,10 @@ static int dn_fib_rule_fill(struct fib_rule *rule, struct sk_buff *skb,
248240
frh->src_len = r->src_len;
249241
frh->tos = 0;
250242

251-
#ifdef CONFIG_DECNET_ROUTE_FWMARK
252243
if (r->fwmark)
253244
NLA_PUT_U32(skb, FRA_FWMARK, r->fwmark);
254245
if (r->fwmask || r->fwmark)
255246
NLA_PUT_U32(skb, FRA_FWMASK, r->fwmask);
256-
#endif
257247
if (r->dst_len)
258248
NLA_PUT_U16(skb, FRA_DST, r->dst);
259249
if (r->src_len)

net/ipv4/Kconfig

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,6 @@ config IP_MULTIPLE_TABLES
104104

105105
If unsure, say N.
106106

107-
config IP_ROUTE_FWMARK
108-
bool "IP: use netfilter MARK value as routing key"
109-
depends on IP_MULTIPLE_TABLES && NETFILTER
110-
help
111-
If you say Y here, you will be able to specify different routes for
112-
packets with different mark values (see iptables(8), MARK target).
113-
114107
config IP_ROUTE_MULTIPATH
115108
bool "IP: equal cost multipath"
116109
depends on IP_ADVANCED_ROUTER

net/ipv4/fib_frontend.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -768,8 +768,8 @@ static void nl_fib_lookup(struct fib_result_nl *frn, struct fib_table *tb )
768768
{
769769

770770
struct fib_result res;
771-
struct flowi fl = { .nl_u = { .ip4_u = { .daddr = frn->fl_addr,
772-
.fwmark = frn->fl_fwmark,
771+
struct flowi fl = { .mark = frn->fl_fwmark,
772+
.nl_u = { .ip4_u = { .daddr = frn->fl_addr,
773773
.tos = frn->fl_tos,
774774
.scope = frn->fl_scope } } };
775775
if (tb) {

net/ipv4/fib_rules.c

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,8 @@ struct fib4_rule
4444
__be32 srcmask;
4545
__be32 dst;
4646
__be32 dstmask;
47-
#ifdef CONFIG_IP_ROUTE_FWMARK
4847
u32 fwmark;
4948
u32 fwmask;
50-
#endif
5149
#ifdef CONFIG_NET_CLS_ROUTE
5250
u32 tclassid;
5351
#endif
@@ -160,10 +158,8 @@ static int fib4_rule_match(struct fib_rule *rule, struct flowi *fl, int flags)
160158
if (r->tos && (r->tos != fl->fl4_tos))
161159
return 0;
162160

163-
#ifdef CONFIG_IP_ROUTE_FWMARK
164-
if ((r->fwmark ^ fl->fl4_fwmark) & r->fwmask)
161+
if ((r->fwmark ^ fl->mark) & r->fwmask)
165162
return 0;
166-
#endif
167163

168164
return 1;
169165
}
@@ -220,7 +216,6 @@ static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb,
220216
if (tb[FRA_DST])
221217
rule4->dst = nla_get_be32(tb[FRA_DST]);
222218

223-
#ifdef CONFIG_IP_ROUTE_FWMARK
224219
if (tb[FRA_FWMARK]) {
225220
rule4->fwmark = nla_get_u32(tb[FRA_FWMARK]);
226221
if (rule4->fwmark)
@@ -232,7 +227,6 @@ static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb,
232227

233228
if (tb[FRA_FWMASK])
234229
rule4->fwmask = nla_get_u32(tb[FRA_FWMASK]);
235-
#endif
236230

237231
#ifdef CONFIG_NET_CLS_ROUTE
238232
if (tb[FRA_FLOW])
@@ -264,13 +258,11 @@ static int fib4_rule_compare(struct fib_rule *rule, struct fib_rule_hdr *frh,
264258
if (frh->tos && (rule4->tos != frh->tos))
265259
return 0;
266260

267-
#ifdef CONFIG_IP_ROUTE_FWMARK
268261
if (tb[FRA_FWMARK] && (rule4->fwmark != nla_get_u32(tb[FRA_FWMARK])))
269262
return 0;
270263

271264
if (tb[FRA_FWMASK] && (rule4->fwmask != nla_get_u32(tb[FRA_FWMASK])))
272265
return 0;
273-
#endif
274266

275267
#ifdef CONFIG_NET_CLS_ROUTE
276268
if (tb[FRA_FLOW] && (rule4->tclassid != nla_get_u32(tb[FRA_FLOW])))
@@ -296,13 +288,11 @@ static int fib4_rule_fill(struct fib_rule *rule, struct sk_buff *skb,
296288
frh->src_len = rule4->src_len;
297289
frh->tos = rule4->tos;
298290

299-
#ifdef CONFIG_IP_ROUTE_FWMARK
300291
if (rule4->fwmark)
301292
NLA_PUT_U32(skb, FRA_FWMARK, rule4->fwmark);
302293

303294
if (rule4->fwmask || rule4->fwmark)
304295
NLA_PUT_U32(skb, FRA_FWMASK, rule4->fwmask);
305-
#endif
306296

307297
if (rule4->dst_len)
308298
NLA_PUT_BE32(skb, FRA_DST, rule4->dst);

net/ipv4/netfilter.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,7 @@ int ip_route_me_harder(struct sk_buff **pskb, unsigned addr_type)
2727
fl.nl_u.ip4_u.saddr = iph->saddr;
2828
fl.nl_u.ip4_u.tos = RT_TOS(iph->tos);
2929
fl.oif = (*pskb)->sk ? (*pskb)->sk->sk_bound_dev_if : 0;
30-
#ifdef CONFIG_IP_ROUTE_FWMARK
31-
fl.nl_u.ip4_u.fwmark = (*pskb)->mark;
32-
#endif
30+
fl.mark = (*pskb)->mark;
3331
if (ip_route_output_key(&rt, &fl) != 0)
3432
return -1;
3533

net/ipv4/netfilter/iptable_mangle.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,7 @@ ipt_local_hook(unsigned int hook,
153153
if (ret != NF_DROP && ret != NF_STOLEN && ret != NF_QUEUE
154154
&& ((*pskb)->nh.iph->saddr != saddr
155155
|| (*pskb)->nh.iph->daddr != daddr
156-
#ifdef CONFIG_IP_ROUTE_FWMARK
157156
|| (*pskb)->mark != mark
158-
#endif
159157
|| (*pskb)->nh.iph->tos != tos))
160158
if (ip_route_me_harder(pskb, RTN_UNSPEC))
161159
ret = NF_DROP;

0 commit comments

Comments
 (0)