• Xin Long's avatar
    ping: fix the dif and sdif check in ping_lookup · 35a79e64
    Xin Long authored
    When 'ping' changes to use PING socket instead of RAW socket by:
    
       # sysctl -w net.ipv4.ping_group_range="0 100"
    
    There is another regression caused when matching sk_bound_dev_if
    and dif, RAW socket is using inet_iif() while PING socket lookup
    is using skb->dev->ifindex, the cmd below fails due to this:
    
      # ip link add dummy0 type dummy
      # ip link set dummy0 up
      # ip addr add 192.168.111.1/24 dev dummy0
      # ping -I dummy0 192.168.111.1 -c1
    
    The issue was also reported on:
    
      https://github.com/iputils/iputils/issues/104
    
    But fixed in iputils in a wrong way by not binding to device when
    destination IP is on device, and it will cause some of kselftests
    to fail, as Jianlin noticed.
    
    This patch is to use inet(6)_iif and inet(6)_sdif to get dif and
    sdif for PING socket, and keep consistent with RAW socket.
    
    Fixes: c319b4d7 ("net: ipv4: add IPPROTO_ICMP socket kind")
    Reported-by: default avatarJianlin Shi <jishi@redhat.com>
    Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    35a79e64
ping.c 27.9 KB