-
Couldn't load subscription status.
- Fork 2.5k
Fix dish socket multicast bind issue #4820
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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