diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2013-08-20 16:16:55 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2013-08-20 16:16:55 +0200 |
commit | d52f208d9fb6381f3c3656c5916866a4b779fa82 (patch) | |
tree | 05b08cf037283f1c7a9e10001c962f42422a9aac /src/send.c | |
parent | f6640a80f4be19e988fd7426c3f897f4d3f614e4 (diff) | |
download | fastd-d52f208d9fb6381f3c3656c5916866a4b779fa82.tar fastd-d52f208d9fb6381f3c3656c5916866a4b779fa82.zip |
Use v4-mapped addresses for IPv4 peers on IPv6 sockets
This is needed at least on FreeBSD
Diffstat (limited to 'src/send.c')
-rw-r--r-- | src/send.c | 9 |
1 files changed, 9 insertions, 0 deletions
@@ -70,6 +70,7 @@ static void send_type(fastd_context_t *ctx, const fastd_socket_t *sock, const fa struct msghdr msg = {}; char cbuf[1024] = {}; + fastd_peer_address_t remote_addr6; switch (remote_addr->sa.sa_family) { case AF_INET: @@ -86,6 +87,14 @@ static void send_type(fastd_context_t *ctx, const fastd_socket_t *sock, const fa exit_bug(ctx, "unsupported address family"); } + if (sock->bound_addr->sa.sa_family == AF_INET6) { + remote_addr6 = *remote_addr; + fastd_peer_address_widen(&remote_addr6); + + msg.msg_name = (void*)&remote_addr6.in6; + msg.msg_namelen = sizeof(struct sockaddr_in6); + } + struct iovec iov[2] = { { .iov_base = &packet_type, .iov_len = 1 }, { .iov_base = buffer.data, .iov_len = buffer.len } |