diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2012-04-03 09:56:44 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2012-04-03 09:56:44 +0200 |
commit | c2e81f00dcf2e1132bcbbcdd1f488ae4e75dd521 (patch) | |
tree | 281161da82078434c99ed411da55c6d7d415c6c6 | |
parent | 171dd6a58b89a5a7cdb55711515bec532a8f1bc6 (diff) | |
download | fastd-c2e81f00dcf2e1132bcbbcdd1f488ae4e75dd521.tar fastd-c2e81f00dcf2e1132bcbbcdd1f488ae4e75dd521.zip |
Don't set bind sockaddr in config if none is configured
-rw-r--r-- | src/config.c | 13 | ||||
-rw-r--r-- | src/fastd.c | 25 |
2 files changed, 21 insertions, 17 deletions
diff --git a/src/config.c b/src/config.c index 5fa1591..b745251 100644 --- a/src/config.c +++ b/src/config.c @@ -491,19 +491,6 @@ void fastd_configure(fastd_context *ctx, fastd_config *conf, int argc, char *con } } - if (conf->n_floating && conf->bind_addr_in.sin_family == AF_UNSPEC - && conf->bind_addr_in6.sin6_family == AF_UNSPEC) { - conf->bind_addr_in.sin_family = AF_INET; - conf->bind_addr_in6.sin6_family = AF_INET6; - } - else { - if (conf->n_v4) - conf->bind_addr_in.sin_family = AF_INET; - - if (conf->n_v6) - conf->bind_addr_in6.sin6_family = AF_INET6; - } - if (conf->mode == MODE_TUN && (!conf->peers || conf->peers->next)) exit_error(ctx, "config error: for tun mode exactly one peer must be configured"); diff --git a/src/fastd.c b/src/fastd.c index 21e5027..939c651 100644 --- a/src/fastd.c +++ b/src/fastd.c @@ -77,13 +77,30 @@ static void init_tuntap(fastd_context *ctx) { } static void init_socket(fastd_context *ctx) { - if (ctx->conf->bind_addr_in.sin_family == AF_INET) { + struct sockaddr_in addr_in = ctx->conf->bind_addr_in; + struct sockaddr_in6 addr_in6 = ctx->conf->bind_addr_in6; + + if (addr_in.sin_family == AF_UNSPEC && addr_in6.sin6_family == AF_UNSPEC) { + if (ctx->conf->n_floating || ctx->conf->n_v4) + addr_in.sin_family = AF_INET; + + if (ctx->conf->n_floating || ctx->conf->n_v6) + addr_in6.sin6_family = AF_INET6; + } + + if (addr_in.sin_family == AF_UNSPEC && ctx->conf->n_v4) + pr_warn(ctx, "there are IPv4 peers defined, but bind is explicitly set to IPv6"); + + if (addr_in6.sin6_family == AF_UNSPEC && ctx->conf->n_v6) + pr_warn(ctx, "there are IPv6 peers defined, but bind is explicitly set to IPv4"); + + if (addr_in.sin_family == AF_INET) { pr_debug(ctx, "Initializing IPv4 socket..."); if ((ctx->sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) exit_errno(ctx, "socket"); - if (bind(ctx->sockfd, (struct sockaddr*)&ctx->conf->bind_addr_in, sizeof(struct sockaddr_in))) + if (bind(ctx->sockfd, (struct sockaddr*)&addr_in, sizeof(struct sockaddr_in))) exit_errno(ctx, "bind"); pr_debug(ctx, "IPv4 socket initialized."); @@ -92,7 +109,7 @@ static void init_socket(fastd_context *ctx) { ctx->sockfd = -1; } - if (ctx->conf->bind_addr_in6.sin6_family == AF_INET6) { + if (addr_in6.sin6_family == AF_INET6) { pr_debug(ctx, "Initializing IPv6 socket..."); if ((ctx->sock6fd = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP)) < 0) { @@ -106,7 +123,7 @@ static void init_socket(fastd_context *ctx) { if (setsockopt(ctx->sock6fd, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof(val))) exit_errno(ctx, "setsockopt"); - if (bind(ctx->sock6fd, (struct sockaddr*)&ctx->conf->bind_addr_in6, sizeof(struct sockaddr_in6))) + if (bind(ctx->sock6fd, (struct sockaddr*)&addr_in6, sizeof(struct sockaddr_in6))) exit_errno(ctx, "bind"); pr_debug(ctx, "IPv6 socket initialized."); |