I have a linux server with two NICs (eth0 and eth1), and have set eth0 as default in "ip route." Now I would like to receive multicast packets on eth1. I have added "224.0.20.0/24 dev eth1 proto static scope link" to the routing table, and I connect as follows:
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
// port 12345, adress INADDR_ANY
bind(sock, &bind_addr, sizeof(bind_addr));
// multicast address 224.0.20.100, interface address 10.13.0.7 (=eth1)
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imreq, sizeof(imreq));
According to ip maddr
it connects to that group on the right interface, and tshark -i eth1
shows that I am actually getting multicast packets.
However, I don't get any packets when calling recvfrom(sock)
. If I set "ip route default" to eth1 (instead of eth0), I do get packets via recvfrom. Is this an issue with my code or with my network setup, and what is the correct way of doing this?
(update) solution: caf hinted that this might be the same problem; indeed: after doing echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
I can now receive multicast packets!
eth1
? – Granitenetstat -ng
say? – Graniteeth1 1 224.0.20.100
-- i.e., it seems to be on the right interface. Also, I see in tshark that the IGMP packet is sent out on the right interface (which is presumably why I do see the incoming multicast messages in tshark). – Convergenceecho 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
does the trick! As one would expected, I also receive the multicast traffic with rp_filter set to 1, as long as I add the multicast's source address to eth1's routing table. – Convergence