[M] Change in osmo-ggsn[master]: kernel-gtp: support IPv6 on outer layer (backwards compatible)

2024-05-13 Thread osmith
osmith has abandoned this change. ( 
https://gerrit.osmocom.org/c/osmo-ggsn/+/36072?usp=email )

Change subject: kernel-gtp: support IPv6 on outer layer (backwards compatible)
..


Abandoned

not needed for OS#6096, probably not worth finishing up
--
To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/36072?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ggsn
Gerrit-Branch: master
Gerrit-Change-Id: I4212d847b6e1ad5ce120451a2d8a5578c48b90fe
Gerrit-Change-Number: 36072
Gerrit-PatchSet: 1
Gerrit-Owner: osmith 
Gerrit-Reviewer: Jenkins Builder
Gerrit-MessageType: abandon


[M] Change in osmo-ggsn[master]: kernel-gtp: support IPv6 on outer layer (backwards compatible)

2024-02-23 Thread osmith
osmith has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/osmo-ggsn/+/36072?usp=email )


Change subject: kernel-gtp: support IPv6 on outer layer (backwards compatible)
..

kernel-gtp: support IPv6 on outer layer (backwards compatible)

Implement I257fff1dcd9d030a7f9ea936b2693a3f13208230 again, but this
time make it backwards compatible. The IPv6 are stored in a new
internal struct, and setters and getters are added.

Related: OS#1953, OS#6096
Change-Id: I4212d847b6e1ad5ce120451a2d8a5578c48b90fe
---
M ggsn/ggsn.c
M gtp/gsn.c
M gtp/gsn_internal.h
M gtp/gtp.c
M gtp/gtp_internal.h
M include/osmocom/gtp/gsn.h
6 files changed, 169 insertions(+), 39 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-ggsn refs/changes/72/36072/1

diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c
index de3f614..76ed1d2 100644
--- a/ggsn/ggsn.c
+++ b/ggsn/ggsn.c
@@ -818,7 +818,7 @@
LOGPGGSN(LOGL_INFO, ggsn, "Starting GGSN\n");

/* Start libgtp listener */
-   if (gtp_new(&ggsn->gsn, ggsn->cfg.state_dir, &ggsn->cfg.listen_addr.v4, 
GTP_MODE_GGSN)) {
+   if (gtp_new2(&ggsn->gsn, ggsn->cfg.state_dir, &ggsn->cfg.listen_addr, 
GTP_MODE_GGSN)) {
LOGPGGSN(LOGL_ERROR, ggsn, "Failed to create GTP: %s\n", 
strerror(errno));
return -1;
}
@@ -826,11 +826,10 @@

/* patch in different addresses to use (in case we're behind NAT, the 
listen
 * address is different from what we advertise externally) */
-   if (ggsn->cfg.gtpc_addr.v4.s_addr)
-   ggsn->gsn->gsnc = ggsn->cfg.gtpc_addr.v4;
-
-   if (ggsn->cfg.gtpu_addr.v4.s_addr)
-   ggsn->gsn->gsnu = ggsn->cfg.gtpu_addr.v4;
+   if (ggsn->cfg.gtpc_addr.len)
+   gtp_set_gsnc(ggsn->gsn, &ggsn->cfg.gtpc_addr);
+   if (ggsn->cfg.gtpu_addr.len)
+   gtp_set_gsnu(ggsn->gsn, &ggsn->cfg.gtpu_addr);

/* Register File Descriptors */
osmo_fd_setup(&ggsn->gtp_fd0, ggsn->gsn->fd0, OSMO_FD_READ, 
ggsn_gtp_fd_cb, ggsn, 0);
diff --git a/gtp/gsn.c b/gtp/gsn.c
index 8cb1a47..3cdb61e 100644
--- a/gtp/gsn.c
+++ b/gtp/gsn.c
@@ -431,49 +431,65 @@
talloc_free(filename);
 }

-static int create_and_bind_socket(const char *name, struct gsn_t *gsn, int 
*fd, int domain,
- const struct in_addr *listen, int port)
+static int create_and_bind_socket(const char *name, struct gsn_t *gsn, int 
*fd, const struct in46_addr *listen,
+ int port)
 {
-   struct sockaddr_in addr;
+   int family = in46a_to_af(listen);
int type = SOCK_DGRAM;
int protocol = 0;
-
-   *fd = socket(domain, type, protocol);
-
+   struct sockaddr addr = {0};
+   struct sockaddr_in *addr4 = (struct sockaddr_in *)&addr;
+   struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&addr;
+   *fd = socket(family, type, protocol);
if (*fd < 0) {
rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_SOCKET);
LOGP(DLGTP, LOGL_ERROR,
 "%s socket(domain=%d, type=%d, protocol=%d) failed: Error 
= %s\n",
-name, domain, type, protocol, strerror(errno));
+name, family, type, protocol, strerror(errno));
return -errno;
}
-
-   memset(&addr, 0, sizeof(addr));
-   addr.sin_family = domain;
-   addr.sin_addr = *listen;
-   addr.sin_port = htons(port);
+   switch (family) {
+   case AF_INET:
+   addr4->sin_family = AF_INET;
+   addr4->sin_addr = listen->v4;
+   addr4->sin_port = htons(port);
 #if defined(__FreeBSD__) || defined(__APPLE__)
-   addr.sin_len = sizeof(addr);
+   addr4->sin_len = sizeof(struct addr);
 #endif
-
-   if (bind(*fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+   break;
+   case AF_INET6:
+   addr6->sin6_family = AF_INET6;
+   addr6->sin6_addr = listen->v6;
+   addr6->sin6_port = htons(port);
+#if defined(__FreeBSD__) || defined(__APPLE__)
+   addr6->sin6_len = sizeof(struct addr);
+#endif
+   break;
+   default:
+   OSMO_ASSERT(false);
+   break;
+   }
+   if (bind(*fd, &addr, sizeof(addr)) < 0) {
rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_SOCKET);
-   LOGP_WITH_ADDR(DLGTP, LOGL_ERROR, addr,
-  "%s bind(fd=%d) failed: Error = %s\n",
-  name, *fd, strerror(errno));
+   LOGP(DLGTP, LOGL_ERROR,
+"%s bind(fd=%d, addr=(%s:%d)) failed: Error = %s\n",
+name, *fd, in46a_ntoa(listen), port, strerror(errno));
return -errno;
}
-
return 0;
 }

-int gtp_new(struct gsn_t **gsn, char *statedir, struct in_addr *listen,
-   int mode)
+int gtp_new2(struct gsn_t **g

[M] Change in osmo-ggsn[master]: kernel-gtp: support IPv6 on outer layer

2024-02-22 Thread osmith
osmith has submitted this change. ( 
https://gerrit.osmocom.org/c/osmo-ggsn/+/36031?usp=email )

Change subject: kernel-gtp: support IPv6 on outer layer
..

kernel-gtp: support IPv6 on outer layer

Related: OS#1953, OS#6096
Change-Id: I257fff1dcd9d030a7f9ea936b2693a3f13208230
---
M ggsn/ggsn.c
M gtp/gsn.c
M gtp/gsn.h
M gtp/gtp.c
M lib/in46_addr.c
M lib/in46_addr.h
M sgsnemu/sgsnemu.c
M tests/gtp/Makefile.am
8 files changed, 71 insertions(+), 40 deletions(-)

Approvals:
  osmith: Looks good to me, approved
  Jenkins Builder: Verified
  pespin: Looks good to me, but someone else must approve
  laforge: Looks good to me, but someone else must approve




diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c
index 918d565..cec043d 100644
--- a/ggsn/ggsn.c
+++ b/ggsn/ggsn.c
@@ -822,7 +822,7 @@
LOGPGGSN(LOGL_INFO, ggsn, "Starting GGSN\n");

/* Start libgtp listener */
-   if (gtp_new(&ggsn->gsn, ggsn->cfg.state_dir, &ggsn->cfg.listen_addr.v4, 
GTP_MODE_GGSN)) {
+   if (gtp_new(&ggsn->gsn, ggsn->cfg.state_dir, &ggsn->cfg.listen_addr, 
GTP_MODE_GGSN)) {
LOGPGGSN(LOGL_ERROR, ggsn, "Failed to create GTP: %s\n", 
strerror(errno));
return -1;
}
@@ -830,11 +830,9 @@

/* patch in different addresses to use (in case we're behind NAT, the 
listen
 * address is different from what we advertise externally) */
-   if (ggsn->cfg.gtpc_addr.v4.s_addr)
-   ggsn->gsn->gsnc = ggsn->cfg.gtpc_addr.v4;
+   ggsn->gsn->gsnc = ggsn->cfg.gtpc_addr;

-   if (ggsn->cfg.gtpu_addr.v4.s_addr)
-   ggsn->gsn->gsnu = ggsn->cfg.gtpu_addr.v4;
+   ggsn->gsn->gsnu = ggsn->cfg.gtpu_addr;

/* Register File Descriptors */
osmo_fd_setup(&ggsn->gtp_fd0, ggsn->gsn->fd0, OSMO_FD_READ, 
ggsn_gtp_fd_cb, ggsn, 0);
diff --git a/gtp/gsn.c b/gtp/gsn.c
index eb15eaf..c01d193 100644
--- a/gtp/gsn.c
+++ b/gtp/gsn.c
@@ -64,11 +64,6 @@

 /* Error reporting functions */

-#define LOGP_WITH_ADDR(ss, level, addr, fmt, args...)\
-   LOGP(ss, level, "addr(%s:%d) " fmt,  \
-inet_ntoa((addr).sin_addr), htons((addr).sin_port), \
-##args);
-
 static const struct rate_ctr_desc gsn_ctr_description[] = {
[GSN_CTR_ERR_SOCKET] = { "err:socket", "Socket error" },
[GSN_CTR_ERR_READFROM] = { "err:readfrom", "readfrom() errors" },
@@ -423,46 +418,62 @@
talloc_free(filename);
 }

-static int create_and_bind_socket(const char *name, struct gsn_t *gsn, int 
*fd, int domain,
- const struct in_addr *listen, int port)
+static int create_and_bind_socket(const char *name, struct gsn_t *gsn, int 
*fd, const struct in46_addr *listen,
+ int port)
 {
-   struct sockaddr_in addr;
+   int family = in46a_to_af(listen);
int type = SOCK_DGRAM;
int protocol = 0;
+   struct sockaddr addr = {0};
+   struct sockaddr_in *addr4 = (struct sockaddr_in *)&addr;
+   struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&addr;

-   *fd = socket(domain, type, protocol);
+   *fd = socket(family, type, protocol);

if (*fd < 0) {
rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_SOCKET);
LOGP(DLGTP, LOGL_ERROR,
 "%s socket(domain=%d, type=%d, protocol=%d) failed: Error 
= %s\n",
-name, domain, type, protocol, strerror(errno));
+name, family, type, protocol, strerror(errno));
return -errno;
}

-   memset(&addr, 0, sizeof(addr));
-   addr.sin_family = domain;
-   addr.sin_addr = *listen;
-   addr.sin_port = htons(port);
+   switch (family) {
+   case AF_INET:
+   addr4->sin_family = AF_INET;
+   addr4->sin_addr = listen->v4;
+   addr4->sin_port = htons(port);
 #if defined(__FreeBSD__) || defined(__APPLE__)
-   addr.sin_len = sizeof(addr);
+   addr4->sin_len = sizeof(struct addr);
 #endif
+   break;
+   case AF_INET6:
+   addr6->sin6_family = AF_INET6;
+   addr6->sin6_addr = listen->v6;
+   addr6->sin6_port = htons(port);
+#if defined(__FreeBSD__) || defined(__APPLE__)
+   addr6->sin6_len = sizeof(struct addr);
+#endif
+   break;
+   default:
+   OSMO_ASSERT(false);
+   break;
+   }

-   if (bind(*fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+   if (bind(*fd, &addr, sizeof(addr)) < 0) {
rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_SOCKET);
-   LOGP_WITH_ADDR(DLGTP, LOGL_ERROR, addr,
-  "%s bind(fd=%d) failed: Error = %s\n",
-  name, *fd, strerror(errno));
+   LOGP(DLGTP, LOGL_ERROR,
+"%s bind(fd=%d, addr=(%

[M] Change in osmo-ggsn[master]: kernel-gtp: support IPv6 on outer layer

2024-02-22 Thread osmith
Attention is currently required from: pespin.

osmith has posted comments on this change. ( 
https://gerrit.osmocom.org/c/osmo-ggsn/+/36031?usp=email )

Change subject: kernel-gtp: support IPv6 on outer layer
..


Patch Set 2: Code-Review+2

(1 comment)

File tests/gtp/Makefile.am:

https://gerrit.osmocom.org/c/osmo-ggsn/+/36031/comment/5cb66012_86e24290
PS1, Line 25:   $(top_builddir)/lib/libmisc.a \
> Because gsn.c and gtp.c use functions from in46a now, not having libmisc. […]
Done



--
To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/36031?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ggsn
Gerrit-Branch: master
Gerrit-Change-Id: I257fff1dcd9d030a7f9ea936b2693a3f13208230
Gerrit-Change-Number: 36031
Gerrit-PatchSet: 2
Gerrit-Owner: osmith 
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge 
Gerrit-Reviewer: osmith 
Gerrit-Reviewer: pespin 
Gerrit-Attention: pespin 
Gerrit-Comment-Date: Thu, 22 Feb 2024 12:08:37 +
Gerrit-HasComments: Yes
Gerrit-Has-Labels: Yes
Comment-In-Reply-To: osmith 
Comment-In-Reply-To: pespin 
Gerrit-MessageType: comment


[M] Change in osmo-ggsn[master]: kernel-gtp: support IPv6 on outer layer

2024-02-22 Thread laforge
Attention is currently required from: osmith.

laforge has posted comments on this change. ( 
https://gerrit.osmocom.org/c/osmo-ggsn/+/36031?usp=email )

Change subject: kernel-gtp: support IPv6 on outer layer
..


Patch Set 2: Code-Review+1


--
To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/36031?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ggsn
Gerrit-Branch: master
Gerrit-Change-Id: I257fff1dcd9d030a7f9ea936b2693a3f13208230
Gerrit-Change-Number: 36031
Gerrit-PatchSet: 2
Gerrit-Owner: osmith 
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge 
Gerrit-Reviewer: pespin 
Gerrit-Attention: osmith 
Gerrit-Comment-Date: Thu, 22 Feb 2024 09:40:26 +
Gerrit-HasComments: No
Gerrit-Has-Labels: Yes
Gerrit-MessageType: comment


[M] Change in osmo-ggsn[master]: kernel-gtp: support IPv6 on outer layer

2024-02-21 Thread pespin
Attention is currently required from: osmith.

pespin has posted comments on this change. ( 
https://gerrit.osmocom.org/c/osmo-ggsn/+/36031?usp=email )

Change subject: kernel-gtp: support IPv6 on outer layer
..


Patch Set 2: Code-Review+1


--
To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/36031?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ggsn
Gerrit-Branch: master
Gerrit-Change-Id: I257fff1dcd9d030a7f9ea936b2693a3f13208230
Gerrit-Change-Number: 36031
Gerrit-PatchSet: 2
Gerrit-Owner: osmith 
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: pespin 
Gerrit-Attention: osmith 
Gerrit-Comment-Date: Wed, 21 Feb 2024 16:11:22 +
Gerrit-HasComments: No
Gerrit-Has-Labels: Yes
Gerrit-MessageType: comment


[M] Change in osmo-ggsn[master]: kernel-gtp: support IPv6 on outer layer

2024-02-21 Thread osmith
Attention is currently required from: pespin.

osmith has posted comments on this change. ( 
https://gerrit.osmocom.org/c/osmo-ggsn/+/36031?usp=email )

Change subject: kernel-gtp: support IPv6 on outer layer
..


Patch Set 1:

(4 comments)

File gtp/gsn.c:

https://gerrit.osmocom.org/c/osmo-ggsn/+/36031/comment/9f8da66d_47daf4f8
PS1, Line 424:  int domain = in46a_to_af(listen);
> can we call it family at some point? I had to fiugre out what "domain" meant 
> here.
Done


https://gerrit.osmocom.org/c/osmo-ggsn/+/36031/comment/4fd38ec8_0e2f286c
PS1, Line 446:  addr.sin_len = sizeof(struct addr);
> wrong indentation.
Done


https://gerrit.osmocom.org/c/osmo-ggsn/+/36031/comment/c06f2cf8_41fe7af2
PS1, Line 461:  if (bind(*fd, &addr, sizeof(addr)) < 0)
> the bind can be deduplicated by moving it below.
Done


File tests/gtp/Makefile.am:

https://gerrit.osmocom.org/c/osmo-ggsn/+/36031/comment/78e1273a_c962488f
PS1, Line 25:   $(top_builddir)/lib/libmisc.a \
> why is this libmisc needed here now?
Because gsn.c and gtp.c use functions from in46a now, not having libmisc.a 
leads to undefined reference errors.



--
To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/36031?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ggsn
Gerrit-Branch: master
Gerrit-Change-Id: I257fff1dcd9d030a7f9ea936b2693a3f13208230
Gerrit-Change-Number: 36031
Gerrit-PatchSet: 1
Gerrit-Owner: osmith 
Gerrit-Reviewer: Jenkins Builder
Gerrit-CC: pespin 
Gerrit-Attention: pespin 
Gerrit-Comment-Date: Wed, 21 Feb 2024 15:24:23 +
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Comment-In-Reply-To: pespin 
Gerrit-MessageType: comment


[M] Change in osmo-ggsn[master]: kernel-gtp: support IPv6 on outer layer

2024-02-21 Thread osmith
Attention is currently required from: osmith.

Hello Jenkins Builder,

I'd like you to reexamine a change. Please visit

https://gerrit.osmocom.org/c/osmo-ggsn/+/36031?usp=email

to look at the new patch set (#2).

The following approvals got outdated and were removed:
Verified+1 by Jenkins Builder


Change subject: kernel-gtp: support IPv6 on outer layer
..

kernel-gtp: support IPv6 on outer layer

Related: OS#1953, OS#6096
Change-Id: I257fff1dcd9d030a7f9ea936b2693a3f13208230
---
M ggsn/ggsn.c
M gtp/gsn.c
M gtp/gsn.h
M gtp/gtp.c
M lib/in46_addr.c
M lib/in46_addr.h
M sgsnemu/sgsnemu.c
M tests/gtp/Makefile.am
8 files changed, 71 insertions(+), 40 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-ggsn refs/changes/31/36031/2
--
To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/36031?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ggsn
Gerrit-Branch: master
Gerrit-Change-Id: I257fff1dcd9d030a7f9ea936b2693a3f13208230
Gerrit-Change-Number: 36031
Gerrit-PatchSet: 2
Gerrit-Owner: osmith 
Gerrit-Reviewer: Jenkins Builder
Gerrit-CC: pespin 
Gerrit-Attention: osmith 
Gerrit-MessageType: newpatchset


[M] Change in osmo-ggsn[master]: kernel-gtp: support IPv6 on outer layer

2024-02-21 Thread pespin
Attention is currently required from: osmith.

pespin has posted comments on this change. ( 
https://gerrit.osmocom.org/c/osmo-ggsn/+/36031?usp=email )

Change subject: kernel-gtp: support IPv6 on outer layer
..


Patch Set 1:

(4 comments)

File gtp/gsn.c:

https://gerrit.osmocom.org/c/osmo-ggsn/+/36031/comment/7495bdfd_f911e5dd
PS1, Line 424:  int domain = in46a_to_af(listen);
can we call it family at some point? I had to fiugre out what "domain" meant 
here.


https://gerrit.osmocom.org/c/osmo-ggsn/+/36031/comment/a6599b05_2820182d
PS1, Line 446:  addr.sin_len = sizeof(struct addr);
wrong indentation.


https://gerrit.osmocom.org/c/osmo-ggsn/+/36031/comment/1c74bf8f_636c7218
PS1, Line 461:  if (bind(*fd, &addr, sizeof(addr)) < 0)
the bind can be deduplicated by moving it below.


File tests/gtp/Makefile.am:

https://gerrit.osmocom.org/c/osmo-ggsn/+/36031/comment/e412d4a9_ada84f2a
PS1, Line 25:   $(top_builddir)/lib/libmisc.a \
why is this libmisc needed here now?



--
To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/36031?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ggsn
Gerrit-Branch: master
Gerrit-Change-Id: I257fff1dcd9d030a7f9ea936b2693a3f13208230
Gerrit-Change-Number: 36031
Gerrit-PatchSet: 1
Gerrit-Owner: osmith 
Gerrit-Reviewer: Jenkins Builder
Gerrit-CC: pespin 
Gerrit-Attention: osmith 
Gerrit-Comment-Date: Wed, 21 Feb 2024 12:24:12 +
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Gerrit-MessageType: comment


[M] Change in osmo-ggsn[master]: kernel-gtp: support IPv6 on outer layer

2024-02-21 Thread osmith
osmith has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/osmo-ggsn/+/36031?usp=email )


Change subject: kernel-gtp: support IPv6 on outer layer
..

kernel-gtp: support IPv6 on outer layer

Related: OS#1953, OS#6096
Change-Id: I257fff1dcd9d030a7f9ea936b2693a3f13208230
---
M ggsn/ggsn.c
M gtp/gsn.c
M gtp/gsn.h
M gtp/gtp.c
M lib/in46_addr.c
M lib/in46_addr.h
M sgsnemu/sgsnemu.c
M tests/gtp/Makefile.am
8 files changed, 78 insertions(+), 41 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-ggsn refs/changes/31/36031/1

diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c
index 918d565..cec043d 100644
--- a/ggsn/ggsn.c
+++ b/ggsn/ggsn.c
@@ -822,7 +822,7 @@
LOGPGGSN(LOGL_INFO, ggsn, "Starting GGSN\n");

/* Start libgtp listener */
-   if (gtp_new(&ggsn->gsn, ggsn->cfg.state_dir, &ggsn->cfg.listen_addr.v4, 
GTP_MODE_GGSN)) {
+   if (gtp_new(&ggsn->gsn, ggsn->cfg.state_dir, &ggsn->cfg.listen_addr, 
GTP_MODE_GGSN)) {
LOGPGGSN(LOGL_ERROR, ggsn, "Failed to create GTP: %s\n", 
strerror(errno));
return -1;
}
@@ -830,11 +830,9 @@

/* patch in different addresses to use (in case we're behind NAT, the 
listen
 * address is different from what we advertise externally) */
-   if (ggsn->cfg.gtpc_addr.v4.s_addr)
-   ggsn->gsn->gsnc = ggsn->cfg.gtpc_addr.v4;
+   ggsn->gsn->gsnc = ggsn->cfg.gtpc_addr;

-   if (ggsn->cfg.gtpu_addr.v4.s_addr)
-   ggsn->gsn->gsnu = ggsn->cfg.gtpu_addr.v4;
+   ggsn->gsn->gsnu = ggsn->cfg.gtpu_addr;

/* Register File Descriptors */
osmo_fd_setup(&ggsn->gtp_fd0, ggsn->gsn->fd0, OSMO_FD_READ, 
ggsn_gtp_fd_cb, ggsn, 0);
diff --git a/gtp/gsn.c b/gtp/gsn.c
index eb15eaf..1109d66 100644
--- a/gtp/gsn.c
+++ b/gtp/gsn.c
@@ -64,11 +64,6 @@

 /* Error reporting functions */

-#define LOGP_WITH_ADDR(ss, level, addr, fmt, args...)\
-   LOGP(ss, level, "addr(%s:%d) " fmt,  \
-inet_ntoa((addr).sin_addr), htons((addr).sin_port), \
-##args);
-
 static const struct rate_ctr_desc gsn_ctr_description[] = {
[GSN_CTR_ERR_SOCKET] = { "err:socket", "Socket error" },
[GSN_CTR_ERR_READFROM] = { "err:readfrom", "readfrom() errors" },
@@ -423,10 +418,10 @@
talloc_free(filename);
 }

-static int create_and_bind_socket(const char *name, struct gsn_t *gsn, int 
*fd, int domain,
- const struct in_addr *listen, int port)
+static int create_and_bind_socket(const char *name, struct gsn_t *gsn, int 
*fd, const struct in46_addr *listen,
+ int port)
 {
-   struct sockaddr_in addr;
+   int domain = in46a_to_af(listen);
int type = SOCK_DGRAM;
int protocol = 0;

@@ -440,29 +435,51 @@
return -errno;
}

-   memset(&addr, 0, sizeof(addr));
-   addr.sin_family = domain;
-   addr.sin_addr = *listen;
-   addr.sin_port = htons(port);
+   switch (domain) {
+   case AF_INET:
+   {
+   struct sockaddr_in addr = {0};
+   addr.sin_family = AF_INET;
+   addr.sin_addr = listen->v4;
+   addr.sin_port = htons(port);
 #if defined(__FreeBSD__) || defined(__APPLE__)
-   addr.sin_len = sizeof(addr);
+   addr.sin_len = sizeof(struct addr);
 #endif
-
-   if (bind(*fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
-   rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_SOCKET);
-   LOGP_WITH_ADDR(DLGTP, LOGL_ERROR, addr,
-  "%s bind(fd=%d) failed: Error = %s\n",
-  name, *fd, strerror(errno));
-   return -errno;
+   if (bind(*fd, &addr, sizeof(addr)) < 0)
+   goto bind_err;
+   break;
+   }
+   case AF_INET6:
+   {
+   struct sockaddr_in6 addr = {0};
+   addr.sin6_family = AF_INET6;
+   addr.sin6_addr = listen->v6;
+   addr.sin6_port = htons(port);
+#if defined(__FreeBSD__) || defined(__APPLE__)
+   addr.sin6_len = sizeof(struct addr);
+#endif
+   if (bind(*fd, &addr, sizeof(addr)) < 0)
+   goto bind_err;
+   break;
+   }
+   default:
+   OSMO_ASSERT(false);
+   break;
}

return 0;
+
+bind_err:
+   rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_SOCKET);
+   LOGP(DLGTP, LOGL_ERROR,
+"%s bind(fd=%d, addr=(%s:%d)) failed: Error = %s\n",
+name, *fd, in46a_ntoa(listen), port, strerror(errno));
+   return -errno;
 }

-int gtp_new(struct gsn_t **gsn, char *statedir, struct in_addr *listen,
-   int mode)
+int gtp_new(struct gsn_t **gsn, char *statedir, struct in46_addr *listen, in