From: Noah Peterson NoahBPeterson1997@gmail.com
There is an issue with some Linux distributions where network interfaces are up and active, but do not have the correct link-local address. This condition is now checked and output to stderr to better help users troubleshoot this issue.
Signed-off-by: Noah Peterson noahbpeterson1997@gmail.com --- v3: Add changelog, change newlines, noted by Sven sven@narfation.org v2: Fixed IPv6 address string, noted by Sven sven@narfation.org --- netsock.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/netsock.c b/netsock.c index feed21d..95dbf5e 100644 --- a/netsock.c +++ b/netsock.c @@ -21,6 +21,7 @@ #include <sys/types.h> #include <stdlib.h> #include <sys/epoll.h> +#include <arpa/inet.h> #ifdef CONFIG_ALFRED_CAPABILITIES #include <sys/capability.h> #endif @@ -322,7 +323,19 @@ static int netsock_open(struct globals *globals, struct interface *interface) enable_raw_bind_capability(0);
if (bind(sock, (struct sockaddr *)&sin6, sizeof(sin6)) < 0) { - perror("can't bind"); + char ipstr_buf[INET6_ADDRSTRLEN]; + const char *ipstr; + + ipstr = inet_ntop(AF_INET6, &interface->address.ipv6.s6_addr, + ipstr_buf, INET6_ADDRSTRLEN); + + if (errno == EADDRNOTAVAIL) + fprintf(stderr, "can't bind to interface %s; " + "expected ipv6 address not found: %s\n", + interface->interface, + ipstr); + else + perror("can't bind"); goto err; }
b.a.t.m.a.n@lists.open-mesh.org