Fix dish socket multicast bind issue#4820
Conversation
|
IPv6 multicast more tricky than IPv4. To bind on multicast group in IPv6, it requires to set the |
| if (ipv6_ && _is_multicast && _bind_interface < 0) { | ||
| errno = ENODEV; | ||
| return -1; | ||
| if (ipv6_ && _is_multicast && bind_) { |
There was a problem hiding this comment.
interface index is only needed if it's IPv6 multicast and the socket needs to perform bind(), i.e., the DISH socket.
| errno = ENODEV; | ||
| return -1; | ||
| } | ||
| _target_address.ipv6.sin6_scope_id = _bind_interface; |
There was a problem hiding this comment.
To bind on multicast group in IPv6, it requires to set the scope id to the network interface index, otherwise it will fail.
| { | ||
| if (ipv6_) { | ||
| return "udp://[" MCAST_IPV6 "]:5555"; | ||
| return "udp://eth0;[" MCAST_IPV6 "]:5555"; |
There was a problem hiding this comment.
the DISH socket now must specify the network interface for bind with this change.
I'm concerned about hard-coding the network interface name here, as it might break on other OS or if the host use different names. Not sure if there is any better choice.
Besides, it seems we cannot bind on lo, as it will result Network is unreachable on my box (not sue if it's a common case or just on my box).
|
|
||
| zmq::udp_address_t addr; | ||
| int rc = addr.resolve ("[1:2:3::4];[ff01::1]:5555", false, true); | ||
| int rc = addr.resolve ("[1:2:3::4];[ff01::1]:5555", true, true); |
There was a problem hiding this comment.
change bind from false to true. It won't trigger the ENODEV error when bind is false, as RADIO socket does not require the interface for bind.
|
This is more tricky than I thought, adding network interface makes the test cases dependent on OS and actual host configs, I don't have a good idea how to fix it. Possible options,
|
See #4582 for more details