On 11/2/16 9:29 AM, Cyrill Gorcunov wrote:
> On Wed, Nov 02, 2016 at 09:10:32AM -0600, David Ahern wrote:
>>> @__dif != 0 the match may return socket where sk_bound_dev_if = 0
>>> instead of completely matching one. Isn't it?
>>
>> yes. I recently added an exact_dif to the lookup for listener sockets
>> (see compute_score). Something like that could be added to INET_MATCH.
>
> Seem so. I need to revisit this moment. Because with current lookup code
> iproute2 patches I made and been testing do not kill all sockets bound
> to particular device in one pass (because request from userspace asks
> for index 15 in my case but kernel return one with index 0). At first
> I thought I made a mistake in userspace code but once I added printk's
> into kernel I found that here some strange results over lookup.
Limited to raw sockets or are you looking at multiple spec options (dev,
address, port)?
I have not seen issues with tcp or udp. Running:
ss -aK 'dev == red'
drops all sockets bound to device 'red' (or at least signaling the socket
failure for the app to handle):
root@jessie4:~# ss -ap 'dev == red'
Netid State Recv-Q Send-Q Local Address:Port
Peer Address:Port
udp UNCONN 0 0 *%red:12345
*:* users:(("vrf-test",pid=765,fd=3))
tcp LISTEN 0 1 *%red:12345
*:* users:(("vrf-test",pid=766,fd=3))
tcp ESTAB 0 0 10.100.1.4%red:ssh
10.100.1.254:60298 users:(("sshd",pid=738,fd=3))
root@jessie4:~# ss -aKp 'dev == red'
Netid State Recv-Q Send-Q Local Address:Port
Peer Address:Port
udp UNCONN 0 0 *%red:12345
*:*
users:(("vrf-test",pid=765,fd=3))
tcp LISTEN 0 1 *%red:12345
*:*
users:(("vrf-test",pid=766,fd=3))
tcp ESTAB 0 0 10.100.1.4%red:ssh
10.100.1.254:60298
users:(("sshd",pid=738,fd=3))
root@jessie4:~# ss -ap 'dev == red'
Netid State Recv-Q Send-Q Local Address:Port
Peer Address:Port