[M] Change in osmo-ggsn[master]: kernel-gtp: support IPv6 on outer layer (backwards compatible)
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)
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
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
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
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
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
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
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
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
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