Currently, ip_bucket sets the lookup i_key to 0 if the tunnel's i_flags have VTI_ISVTI flag set but not TUNNEL_KEY. However, it can can never happen that TUNNEL_KEY is set if VTI_ISVTI is also set (see below). Therefore, just drop the check for TUNNEL_KEY and only set i_key to 0 on VTI_ISVTI.
This will allow the VTI code to set TUNNEL_KEY on certain tunnels in a future change. None of the callers of ip_bucket pass in TUNNEL_KEY | VTI_ISVTI. The call graph is as follows: - ip_tunnel_add - ip_tunnel_create - ip_tunnel_ioctl - ipgre_tunnel_ioctl: can set TUNNEL_KEY but not VTI_ISVTI - ipip_tunnel_ioctl: hardcodes i_flags to 0 - vti_tunnel_ioctl: hardcodes i_flags to VTI_ISVTI - ip_tunnel_update: doesn't touch i_flags - ip_tunnel_init_net: memsets flags to 0 - ip_tunnel_newlink - ipgre_newlink - ipgre_netlink_parms: can set TUNNEL_KEY but not VTI_ISVTI - vti_newlink: hardcodes i_flags to VTI_ISVTI - ip_tunnel_changelink: doesn't set flags - ip_tunnel_find - ip_tunnel_ioctl (see above) - ip_tunnel_newlink (see above) - ip_tunnel_changelink (see above) VTI_ISVTI has the same value as TUNNEL_DONT_FRAGMENT, but that is never set into tunnel parameters. Signed-off-by: Lorenzo Colitti <lore...@google.com> --- net/ipv4/ip_tunnel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index 5ddb1cb52b..539c8f22c4 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c @@ -198,7 +198,7 @@ static struct hlist_head *ip_bucket(struct ip_tunnel_net *itn, else remote = 0; - if (!(parms->i_flags & TUNNEL_KEY) && (parms->i_flags & VTI_ISVTI)) + if (parms->i_flags & VTI_ISVTI) i_key = 0; h = ip_tunnel_hash(i_key, remote); -- 2.15.1.620.gb9897f4670-goog