osmith has uploaded this change for review. ( https://gerrit.osmocom.org/c/libgtpnl/+/34734?usp=email )
Change subject: update to prepare for IPv6 support ......................................................................
update to prepare for IPv6 support
Change-Id: Ifc7e3b03a723fb544d1c7b789101102b2c27b60e --- M src/gtp-genl.c M src/gtp.c M src/internal.h 3 files changed, 34 insertions(+), 17 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libgtpnl refs/changes/34/34734/1
diff --git a/src/gtp-genl.c b/src/gtp-genl.c index b8edc72..21297b7 100644 --- a/src/gtp-genl.c +++ b/src/gtp-genl.c @@ -48,10 +48,10 @@ if (t->ifns >= 0) mnl_attr_put_u32(nlh, GTPA_NET_NS_FD, t->ifns); mnl_attr_put_u32(nlh, GTPA_LINK, t->ifidx); - if (t->sgsn_addr.s_addr) - mnl_attr_put_u32(nlh, GTPA_PEER_ADDRESS, t->sgsn_addr.s_addr); - if (t->ms_addr.s_addr) - mnl_attr_put_u32(nlh, GTPA_MS_ADDRESS, t->ms_addr.s_addr); + if (t->ip.sgsn_addr.s_addr) + mnl_attr_put_u32(nlh, GTPA_PEER_ADDRESS, t->ip.sgsn_addr.s_addr); + if (t->ip.ms_addr.s_addr) + mnl_attr_put_u32(nlh, GTPA_MS_ADDRESS, t->ip.ms_addr.s_addr); if (t->gtp_version == GTP_V0) { mnl_attr_put_u64(nlh, GTPA_TID, t->u.v0.tid); mnl_attr_put_u16(nlh, GTPA_FLOW, t->u.v0.flowid); @@ -116,8 +116,12 @@ uint32_t o_tei; } v1; } u; - struct in_addr sgsn_addr; - struct in_addr ms_addr; + union { + struct { + struct in_addr sgsn_addr; + struct in_addr ms_addr; + } ip; + }; };
static int genl_gtp_validate_cb(const struct nlattr *attr, void *data) @@ -167,11 +171,11 @@ if (tb[GTPA_O_TEI]) pdp.u.v1.o_tei = mnl_attr_get_u32(tb[GTPA_O_TEI]); if (tb[GTPA_PEER_ADDRESS]) { - pdp.sgsn_addr.s_addr = + pdp.ip.sgsn_addr.s_addr = mnl_attr_get_u32(tb[GTPA_PEER_ADDRESS]); } if (tb[GTPA_MS_ADDRESS]) { - pdp.ms_addr.s_addr = mnl_attr_get_u32(tb[GTPA_MS_ADDRESS]); + pdp.ip.ms_addr.s_addr = mnl_attr_get_u32(tb[GTPA_MS_ADDRESS]); } if (tb[GTPA_VERSION]) { pdp.version = mnl_attr_get_u32(tb[GTPA_VERSION]); @@ -179,15 +183,15 @@
printf("version %u ", pdp.version); if (pdp.version == GTP_V0) { - inet_ntop(AF_INET, &pdp.ms_addr, buf, sizeof(buf)); + inet_ntop(AF_INET, &pdp.ip.ms_addr, buf, sizeof(buf)); printf("tid %"PRIu64" ms_addr %s ", pdp.u.v0.tid, buf); } else if (pdp.version == GTP_V1) { - inet_ntop(AF_INET, &pdp.ms_addr, buf, sizeof(buf)); + inet_ntop(AF_INET, &pdp.ip.ms_addr, buf, sizeof(buf)); printf("tei %u/%u ms_addr %s ", pdp.u.v1.i_tei, pdp.u.v1.o_tei, buf); } - inet_ntop(AF_INET, &pdp.sgsn_addr, buf, sizeof(buf)); + inet_ntop(AF_INET, &pdp.ip.sgsn_addr, buf, sizeof(buf)); printf("sgsn_addr %s\n", buf);
return MNL_CB_OK; diff --git a/src/gtp.c b/src/gtp.c index e65b0b6..12f4abe 100644 --- a/src/gtp.c +++ b/src/gtp.c @@ -60,13 +60,13 @@
void gtp_tunnel_set_ms_ip4(struct gtp_tunnel *t, struct in_addr *ms_addr) { - t->ms_addr = *ms_addr; + t->ip.ms_addr = *ms_addr; } EXPORT_SYMBOL(gtp_tunnel_set_ms_ip4);
void gtp_tunnel_set_sgsn_ip4(struct gtp_tunnel *t, struct in_addr *sgsn_addr) { - t->sgsn_addr = *sgsn_addr; + t->ip.sgsn_addr = *sgsn_addr; } EXPORT_SYMBOL(gtp_tunnel_set_sgsn_ip4);
@@ -114,13 +114,13 @@
const struct in_addr *gtp_tunnel_get_ms_ip4(struct gtp_tunnel *t) { - return &t->ms_addr; + return &t->ip.ms_addr; } EXPORT_SYMBOL(gtp_tunnel_get_ms_ip4);
const struct in_addr *gtp_tunnel_get_sgsn_ip4(struct gtp_tunnel *t) { - return &t->sgsn_addr; + return &t->ip.sgsn_addr; } EXPORT_SYMBOL(gtp_tunnel_get_sgsn_ip4);
diff --git a/src/internal.h b/src/internal.h index 1754e3b..559461f 100644 --- a/src/internal.h +++ b/src/internal.h @@ -15,8 +15,12 @@ struct gtp_tunnel { int ifns; uint32_t ifidx; - struct in_addr ms_addr; - struct in_addr sgsn_addr; + union { + struct { + struct in_addr ms_addr; + struct in_addr sgsn_addr; + } ip; + }; int gtp_version; union { struct {