The two options metioned in the subject work on IPv4 sockets but are
invalid on IPv6 sockets. Tweak code to set different socket options
when dealing with a v6 socket.
ok?
Index: usr.sbin/httpd/server.c
===================================================================
RCS file: /d/cvs/src/usr.sbin/httpd/server.c,v
retrieving revision 1.97
diff -u -p -r1.97 server.c
--- usr.sbin/httpd/server.c 6 Nov 2016 16:05:02 -0000 1.97
+++ usr.sbin/httpd/server.c 10 Nov 2016 02:19:35 -0000
@@ -569,15 +569,33 @@ server_socket(struct sockaddr_storage *s
*/
if (srv_conf->tcpflags & TCPFLAG_IPTTL) {
val = (int)srv_conf->tcpipttl;
- if (setsockopt(s, IPPROTO_IP, IP_TTL,
- &val, sizeof(val)) == -1)
- goto bad;
+ switch (ss->ss_family) {
+ case AF_INET:
+ if (setsockopt(s, IPPROTO_IP, IP_TTL,
+ &val, sizeof(val)) == -1)
+ goto bad;
+ break;
+ case AF_INET6:
+ if (setsockopt(s, IPPROTO_IPV6, IPV6_UNICAST_HOPS,
+ &val, sizeof(val)) == -1)
+ goto bad;
+ break;
+ }
}
if (srv_conf->tcpflags & TCPFLAG_IPMINTTL) {
val = (int)srv_conf->tcpipminttl;
- if (setsockopt(s, IPPROTO_IP, IP_MINTTL,
- &val, sizeof(val)) == -1)
- goto bad;
+ switch (ss->ss_family) {
+ case AF_INET:
+ if (setsockopt(s, IPPROTO_IP, IP_MINTTL,
+ &val, sizeof(val)) == -1)
+ goto bad;
+ break;
+ case AF_INET6:
+ if (setsockopt(s, IPPROTO_IPV6, IPV6_MINHOPCOUNT,
+ &val, sizeof(val)) == -1)
+ goto bad;
+ break;
+ }
}
/*
Index: usr.sbin/relayd/relay.c
===================================================================
RCS file: /d/cvs/src/usr.sbin/relayd/relay.c,v
retrieving revision 1.216
diff -u -p -r1.216 relay.c
--- usr.sbin/relayd/relay.c 29 Sep 2016 22:04:28 -0000 1.216
+++ usr.sbin/relayd/relay.c 10 Nov 2016 02:19:16 -0000
@@ -562,15 +562,33 @@ relay_socket(struct sockaddr_storage *ss
*/
if (proto->tcpflags & TCPFLAG_IPTTL) {
val = (int)proto->tcpipttl;
- if (setsockopt(s, IPPROTO_IP, IP_TTL,
- &val, sizeof(val)) == -1)
- goto bad;
+ switch (ss->ss_family) {
+ case AF_INET:
+ if (setsockopt(s, IPPROTO_IP, IP_TTL,
+ &val, sizeof(val)) == -1)
+ goto bad;
+ break;
+ case AF_INET6:
+ if (setsockopt(s, IPPROTO_IPV6, IPV6_UNICAST_HOPS,
+ &val, sizeof(val)) == -1)
+ goto bad;
+ break;
+ }
}
if (proto->tcpflags & TCPFLAG_IPMINTTL) {
val = (int)proto->tcpipminttl;
- if (setsockopt(s, IPPROTO_IP, IP_MINTTL,
- &val, sizeof(val)) == -1)
- goto bad;
+ switch (ss->ss_family) {
+ case AF_INET:
+ if (setsockopt(s, IPPROTO_IP, IP_MINTTL,
+ &val, sizeof(val)) == -1)
+ goto bad;
+ break;
+ case AF_INET6:
+ if (setsockopt(s, IPPROTO_IPV6, IPV6_MINHOPCOUNT,
+ &val, sizeof(val)) == -1)
+ goto bad;
+ break;
+ }
}
/*
Index: usr.sbin/relayd/relay_udp.c
===================================================================
RCS file: /d/cvs/src/usr.sbin/relayd/relay_udp.c,v
retrieving revision 1.43
diff -u -p -r1.43 relay_udp.c
--- usr.sbin/relayd/relay_udp.c 2 Sep 2016 14:31:47 -0000 1.43
+++ usr.sbin/relayd/relay_udp.c 10 Nov 2016 02:19:16 -0000
@@ -138,15 +138,33 @@ relay_udp_socket(struct sockaddr_storage
*/
if (proto->tcpflags & TCPFLAG_IPTTL) {
val = (int)proto->tcpipttl;
- if (setsockopt(s, IPPROTO_IP, IP_TTL,
- &val, sizeof(val)) == -1)
- goto bad;
+ switch (ss->ss_family) {
+ case AF_INET:
+ if (setsockopt(s, IPPROTO_IP, IP_TTL,
+ &val, sizeof(val)) == -1)
+ goto bad;
+ break;
+ case AF_INET6:
+ if (setsockopt(s, IPPROTO_IPV6, IPV6_UNICAST_HOPS,
+ &val, sizeof(val)) == -1)
+ goto bad;
+ break;
+ }
}
if (proto->tcpflags & TCPFLAG_IPMINTTL) {
val = (int)proto->tcpipminttl;
- if (setsockopt(s, IPPROTO_IP, IP_MINTTL,
- &val, sizeof(val)) == -1)
- goto bad;
+ switch (ss->ss_family) {
+ case AF_INET:
+ if (setsockopt(s, IPPROTO_IP, IP_MINTTL,
+ &val, sizeof(val)) == -1)
+ goto bad;
+ break;
+ case AF_INET6:
+ if (setsockopt(s, IPPROTO_IPV6, IPV6_MINHOPCOUNT,
+ &val, sizeof(val)) == -1)
+ goto bad;
+ break;
+ }
}
return (s);
--
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE