aboutsummaryrefslogtreecommitdiffstats
path: root/tools/gtp-link.c
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2024-01-31 18:17:51 +0100
committerOliver Smith <osmith@sysmocom.de>2024-02-15 15:41:42 +0100
commit9911f6bfeb5076ed5f84bde7cc9d01e966db6050 (patch)
treeb8f7ef8ab3d31cb857af1324e92fdcd4773d068c /tools/gtp-link.c
parent38b5e239d6b1967c21cbd43a7a281411cd69ed67 (diff)
gtp-link: set IPv6 socket only
GTP driver bails out for IPv4-mapped-IPv6 socket with EADDRNOAVAIL, to prevent issues with setsockopt IPV6_ADDRFORM. GTP control plane checks that tunnel family matches the socket family for this GTP device, ie. there is a 1:1 mapping between the socket listener and the device which determines the supported IP tunnel header. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> Change-Id: I887a107657059adeb14ae425576ae7ea9018f762
Diffstat (limited to 'tools/gtp-link.c')
-rw-r--r--tools/gtp-link.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/tools/gtp-link.c b/tools/gtp-link.c
index feb2efe..325a45f 100644
--- a/tools/gtp-link.c
+++ b/tools/gtp-link.c
@@ -75,6 +75,7 @@ static int setup_socket(struct gtp_server_sock *gtp_sock, int family)
{
int fd1 = socket(family, SOCK_DGRAM, 0);
int fd2 = socket(family, SOCK_DGRAM, 0);
+ int one = 1;
if (fd1 < 0 || fd2 < 0)
return -1;
@@ -95,6 +96,10 @@ static int setup_socket(struct gtp_server_sock *gtp_sock, int family)
gtp_sock->len = sizeof(struct sockaddr_in6);
setup_sockaddr_in6(&gtp_sock->sockaddr.fd1.in6, 3386);
setup_sockaddr_in6(&gtp_sock->sockaddr.fd2.in6, 2152);
+ if (setsockopt(fd1, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one)) < 0)
+ perror("setsockopt IPV6_V6ONLY: ");
+ if (setsockopt(fd2, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one)) < 0)
+ perror("setsockopt IPV6_V6ONLY: ");
break;
}