diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2015-04-19 00:19:56 +0200 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2015-04-19 00:31:59 +0200 |
commit | b867a87c2fd694e6e690dc94da76754e89f03370 (patch) | |
tree | 20c007678fa19f1e90843899571af3662d68f390 /sysdep/unix/io.c | |
parent | ef3cac669ca0f6f2b983e33ab6d553705c35f3df (diff) |
Fixes port range socket option
Diffstat (limited to 'sysdep/unix/io.c')
-rw-r--r-- | sysdep/unix/io.c | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c index b4fec9cd..0724667d 100644 --- a/sysdep/unix/io.c +++ b/sysdep/unix/io.c @@ -767,6 +767,32 @@ sk_set_tos6(sock *s, int tos) return 0; } +static inline int +sk_set_high_port(sock *s) +{ + /* Port range setting is optional, ignore it if not supported */ + +#ifdef IP_PORTRANGE + if (sk_is_ipv4(s)) + { + int range = IP_PORTRANGE_HIGH; + if (setsockopt(s->fd, SOL_IP, IP_PORTRANGE, &range, sizeof(range)) < 0) + ERR("IP_PORTRANGE"); + } +#endif + +#ifdef IPV6_PORTRANGE + if (sk_is_ipv6(s)) + { + int range = IPV6_PORTRANGE_HIGH; + if (setsockopt(s->fd, SOL_IPV6, IPV6_PORTRANGE, &range, sizeof(range)) < 0) + ERR("IPV6_PORTRANGE"); + } +#endif + + return 0; +} + static inline byte * sk_skip_ip_header(byte *pkt, int *len) { @@ -1402,14 +1428,10 @@ sk_open(sock *s) } #endif } -#ifdef IP_PORTRANGE - else if (s->flags & SKF_HIGH_PORT) - { - int range = IP_PORTRANGE_HIGH; - if (setsockopt(fd, IPPROTO_IP, IP_PORTRANGE, &range, sizeof(range)) < 0) - log(L_WARN "Socket error: %s%#m", "IP_PORTRANGE"); - } -#endif + else + if (s->flags & SKF_HIGH_PORT) + if (sk_set_high_port(s) < 0) + log(L_WARN "Socket error: %s%#m", s->err); sockaddr_fill(&sa, af, bind_addr, s->iface, bind_port); if (bind(fd, &sa.sa, SA_LEN(sa)) < 0) |