]> git.baikalelectronics.ru Git - kernel.git/commit
sctp: reset flowi4_oif parameter on route lookup
authorXufeng Zhang <xufeng.zhang@windriver.com>
Fri, 25 Apr 2014 08:55:41 +0000 (16:55 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sun, 27 Apr 2014 23:46:17 +0000 (19:46 -0400)
commitd7a6b92e9552b19ec64f71aaabce8bf9fe04b7dc
tree175d7d2b53fc4e6c931e09cb9c531435e79ef884
parent8b9a6dab4beac3b8e45c94fa76403abd09c2401a
sctp: reset flowi4_oif parameter on route lookup

commit b85dfc3ed64 (ipv4: Use caller's on-stack flowi as-is
in output route lookups.) introduces another regression which
is very similar to the problem of commit c7ff215d4 (ipv4: reset
flowi parameters on route connect) wants to fix:
Before we call ip_route_output_key() in sctp_v4_get_dst() to
get a dst that matches a bind address as the source address,
we have already called this function previously and the flowi
parameters have been initialized including flowi4_oif, so when
we call this function again, the process in __ip_route_output_key()
will be different because of the setting of flowi4_oif, and we'll
get a networking device which corresponds to the inputted flowi4_oif
as the output device, this is wrong because we'll never hit this
place if the previously returned source address of dst match one
of the bound addresses.

To reproduce this problem, a vlan setting is enough:
  # ifconfig eth0 up
  # route del default
  # vconfig add eth0 2
  # vconfig add eth0 3
  # ifconfig eth0.2 10.0.1.14 netmask 255.255.255.0
  # route add default gw 10.0.1.254 dev eth0.2
  # ifconfig eth0.3 10.0.0.14 netmask 255.255.255.0
  # ip rule add from 10.0.0.14 table 4
  # ip route add table 4 default via 10.0.0.254 src 10.0.0.14 dev eth0.3
  # sctp_darn -H 10.0.0.14 -P 36422 -h 10.1.4.134 -p 36422 -s -I
You'll detect that all the flow are routed to eth0.2(10.0.1.254).

Signed-off-by: Xufeng Zhang <xufeng.zhang@windriver.com>
Signed-off-by: Julian Anastasov <ja@ssi.bg>
Acked-by: Vlad Yasevich <vyasevich@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sctp/protocol.c