lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 17 Jan 2014 19:10:59 +0400 From: Andrey Dmitrov <andrey.dmitrov@...etlabs.ru> To: netdev@...r.kernel.org CC: Konstantin Ushakov <Konstantin.Ushakov@...etlabs.ru>, "Alexandra N. Kossovsky" <Alexandra.Kossovsky@...etlabs.ru>, Yurij Plotnikov <Yurij.Plotnikov@...etlabs.ru> Subject: Multicast packets receiving problem on linux since version 3.10.1 Greetings, there is a problem with receiving multicast packets on linux-3.10.1 and newer. It's reproducible with two hosts (host_A, host_B), with eth3@...t_A directly connected to eth3@...t_B. Two VLANs and one multicast group are used. Each side opens two sockets and binds them to different VLAN interfaces. host_A arranges both sockets to receive multicast packets of the group. Then the first socket is removed from the group. After this the second socket can no longer receive multicast packets of the group, which sent by the second host. See the example below. host_A: Two VLANs 999 and 1001 are added on eth3: eth3.999 10.208.14.1 eth3.1001 10.208.15.1 1. socket(SOCK_DGRAM) -> 3 2. setsockopt(3, SOL_SOCKET, SO_REUSEADDR, 1) -> 0 3. setsockopt(3, IPPROTO_IP, MCAST_JOIN_GROUP, {229.17.88.168, eth3.999}) -> 0 4. setsockopt(3, SOL_SOCKET, SO_BINDTODEVICE, eth3.999) -> 0 5. bind(3, 0.0.0.0:29214)->0 6. socket(SOCK_DGRAM) -> 4 7. setsockopt(4, SOL_SOCKET, SO_REUSEADDR, 1) -> 0 8. setsockopt(4, IPPROTO_IP, MCAST_JOIN_GROUP, {229.17.88.168, eth3.1001}) -> 0 9. setsockopt(4, SOL_SOCKET, SO_BINDTODEVICE, eth3.1001) -> 0 10. bind(4, 0.0.0.0:29214) -> 0 11. poll({{3, POLLIN}, {4, POLLIN}}, 2, 30000) -> 2 12. recv(3, buf, 100) -> 100 13. recv(4, buf, 99) -> 99 14. setsockopt(3, IPPROTO_IP, MCAST_LEAVE_GROUP, {229.17.88.168, eth3.999}) -> 0 15. poll({{3, POLLIN}, {4, POLLIN}}, 2, 30000) -> 0 Socket 4 does not receive the multicast packet on linux 3.10 and newer. But it receives the packet with older linux versions. Probably the packet is filtered by NIC, tcpdump does not see it. host_B: Two VLANs 999 and 1001 are added on eth3: eth3.999 10.208.14.2 eth3.1001 10.208.15.2 16. socket(SOCK_DGRAM) -> 3 17. bind(3, 10.208.14.2:29219) -> 0 18. socket(SOCK_DGRAM) -> 4 19. bind(4, 10.208.15.2:29219) -> 0 20. sendto(3, 229.17.88.168:29214, buf, 100) -> 100 21. sendto(4, 229.17.88.168:29214, buf, 99) -> 99 Continue when socket 3 on host_A will leave the group (line 14). 22. sendto(3, 229.17.88.168:29214, buf, 100) -> 100 23. sendto(4, 229.17.88.168:29214, buf, 99) -> 99 Note, that if I replace step #14 with: > setsockopt(4, IPPROTO_IP, MCAST_LEAVE_GROUP, {229.17.88.168, eth3.1001}) -> 0 and remove the second socket from the group (instead of the first one) - then the first socket will receive it's packet. Find client and server C programs that reproduce the problem attached. The client logs received packets. As stated above in good case it will log 3 packets and in bad one - only 2. Use the following command lines to start the client and server: host_A: sudo ip link add link eth3 name eth3.999 type vlan id 999 sudo ifconfig eth3.999 10.208.14.1/24 sudo ip link add link eth3 name eth3.1001 type vlan id 1001 sudo ifconfig eth3.1001 10.208.15.1/24 gcc mcast_client.c -o cl sudo ./cl host_B: sudo ip link add link eth3 name eth3.999 type vlan id 999 sudo ifconfig eth3.999 10.208.14.2/24 sudo ip link add link eth3 name eth3.1001 type vlan id 1001 sudo ifconfig eth3.1001 10.208.15.2/24 gcc mcast_serv.c -o serv ./serv Thanks in advance, Andrey Dmitrov View attachment "mcast_client.c" of type "text/x-csrc" (4162 bytes) View attachment "mcast_serv.c" of type "text/x-csrc" (2679 bytes)
Powered by blists - more mailing lists