ipv4: some rt_iif -> rt_route_iif conversions
As rt_iif represents input device even for packets coming from loopback with output route, it is not an unique key specific to input routes. Now rt_route_iif has such role, it was fl.iif in 2.6.38, so better to change the checks at some places to save CPU cycles and to restore 2.6.38 semantics. compare_keys: - input routes: only rt_route_iif matters, rt_iif is same - output routes: only rt_oif matters, rt_iif is not used for matching in __ip_route_output_key - now we are back to 2.6.38 state ip_route_input_common: - matching rt_route_iif implies input route - compared to 2.6.38 we eliminated one rth->fl.oif check because it was not needed even for 2.6.38 compare_hash_inputs: Only the change here is not an optimization, it has effect only for output routes. I assume I'm restoring the original intention to ignore oif, it was using fl.iif - now we are back to 2.6.38 state Signed-off-by: Julian Anastasov <ja@ssi.bg> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5189054dd7
commit
97a8041020
|
@ -722,7 +722,7 @@ static inline bool compare_hash_inputs(const struct rtable *rt1,
|
||||||
{
|
{
|
||||||
return ((((__force u32)rt1->rt_key_dst ^ (__force u32)rt2->rt_key_dst) |
|
return ((((__force u32)rt1->rt_key_dst ^ (__force u32)rt2->rt_key_dst) |
|
||||||
((__force u32)rt1->rt_key_src ^ (__force u32)rt2->rt_key_src) |
|
((__force u32)rt1->rt_key_src ^ (__force u32)rt2->rt_key_src) |
|
||||||
(rt1->rt_iif ^ rt2->rt_iif)) == 0);
|
(rt1->rt_route_iif ^ rt2->rt_route_iif)) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int compare_keys(struct rtable *rt1, struct rtable *rt2)
|
static inline int compare_keys(struct rtable *rt1, struct rtable *rt2)
|
||||||
|
@ -732,8 +732,7 @@ static inline int compare_keys(struct rtable *rt1, struct rtable *rt2)
|
||||||
(rt1->rt_mark ^ rt2->rt_mark) |
|
(rt1->rt_mark ^ rt2->rt_mark) |
|
||||||
(rt1->rt_key_tos ^ rt2->rt_key_tos) |
|
(rt1->rt_key_tos ^ rt2->rt_key_tos) |
|
||||||
(rt1->rt_route_iif ^ rt2->rt_route_iif) |
|
(rt1->rt_route_iif ^ rt2->rt_route_iif) |
|
||||||
(rt1->rt_oif ^ rt2->rt_oif) |
|
(rt1->rt_oif ^ rt2->rt_oif)) == 0;
|
||||||
(rt1->rt_iif ^ rt2->rt_iif)) == 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int compare_netns(struct rtable *rt1, struct rtable *rt2)
|
static inline int compare_netns(struct rtable *rt1, struct rtable *rt2)
|
||||||
|
@ -2321,9 +2320,8 @@ int ip_route_input_common(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||||
rth = rcu_dereference(rth->dst.rt_next)) {
|
rth = rcu_dereference(rth->dst.rt_next)) {
|
||||||
if ((((__force u32)rth->rt_key_dst ^ (__force u32)daddr) |
|
if ((((__force u32)rth->rt_key_dst ^ (__force u32)daddr) |
|
||||||
((__force u32)rth->rt_key_src ^ (__force u32)saddr) |
|
((__force u32)rth->rt_key_src ^ (__force u32)saddr) |
|
||||||
(rth->rt_iif ^ iif) |
|
(rth->rt_route_iif ^ iif) |
|
||||||
(rth->rt_key_tos ^ tos)) == 0 &&
|
(rth->rt_key_tos ^ tos)) == 0 &&
|
||||||
rt_is_input_route(rth) &&
|
|
||||||
rth->rt_mark == skb->mark &&
|
rth->rt_mark == skb->mark &&
|
||||||
net_eq(dev_net(rth->dst.dev), net) &&
|
net_eq(dev_net(rth->dst.dev), net) &&
|
||||||
!rt_is_expired(rth)) {
|
!rt_is_expired(rth)) {
|
||||||
|
|
Loading…
Reference in New Issue