neels has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-upf/+/30467 )
Change subject: in GTP actions, also store local GTP addrs ......................................................................
in GTP actions, also store local GTP addrs
At first, this mostly improves logging of GTP actions.
Subsequently, we will use these to: - for tunend, pick a GTP device based on the local interface. - for tunmap, change the netfilter rules to match on the *local* GTP address instead of the remote one.
Related: SYS#6192 Change-Id: I8488c478c4790d3882b22dcdb1f127838e23dd7b --- M include/osmocom/upf/upf_gtp.h M include/osmocom/upf/upf_nft.h M src/osmo-upf/up_gtp_action.c M src/osmo-upf/up_session.c 4 files changed, 25 insertions(+), 12 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-upf refs/changes/67/30467/1
diff --git a/include/osmocom/upf/upf_gtp.h b/include/osmocom/upf/upf_gtp.h index da04ee6..1a358ba 100644 --- a/include/osmocom/upf/upf_gtp.h +++ b/include/osmocom/upf/upf_gtp.h @@ -65,9 +65,10 @@ * The active state to operate the GTP kernel module accordingly is kept in struct upf_gtp_tunend. */ struct upf_gtp_tunend_desc { struct { + struct osmo_sockaddr gtp_local_addr; uint32_t local_teid; - uint32_t remote_teid; struct osmo_sockaddr gtp_remote_addr; + uint32_t remote_teid; } access; struct { struct osmo_sockaddr ue_local_addr; diff --git a/include/osmocom/upf/upf_nft.h b/include/osmocom/upf/upf_nft.h index 113bfd8..9108a4f 100644 --- a/include/osmocom/upf/upf_nft.h +++ b/include/osmocom/upf/upf_nft.h @@ -31,13 +31,15 @@
struct upf_nft_tunmap_desc { struct { - struct osmo_sockaddr gtp_remote_addr; + struct osmo_sockaddr gtp_local_addr; uint32_t local_teid; + struct osmo_sockaddr gtp_remote_addr; uint32_t remote_teid; } access; struct { - struct osmo_sockaddr gtp_remote_addr; + struct osmo_sockaddr gtp_local_addr; uint32_t local_teid; + struct osmo_sockaddr gtp_remote_addr; uint32_t remote_teid; } core; uint32_t id; diff --git a/src/osmo-upf/up_gtp_action.c b/src/osmo-upf/up_gtp_action.c index 09abd36..84af8e5 100644 --- a/src/osmo-upf/up_gtp_action.c +++ b/src/osmo-upf/up_gtp_action.c @@ -168,18 +168,25 @@ case UP_GTP_U_TUNEND: OSMO_STRBUF_PRINTF(sb, "GTP:tunend GTP-access-r:"); OSMO_STRBUF_APPEND(sb, osmo_sockaddr_to_str_buf2, &a->tunend.access.gtp_remote_addr); - OSMO_STRBUF_PRINTF(sb, " TEID-access-r:0x%"PRIx32" TEID-access-l:0x%"PRIx32" IP-core-l:", - a->tunend.access.remote_teid, a->tunend.access.local_teid); + OSMO_STRBUF_PRINTF(sb, " TEID-access-r:0x%"PRIx32, a->tunend.access.remote_teid); + OSMO_STRBUF_PRINTF(sb, " GTP-access-l:"); + OSMO_STRBUF_APPEND(sb, osmo_sockaddr_to_str_buf2, &a->tunend.access.gtp_local_addr); + OSMO_STRBUF_PRINTF(sb, " TEID-access-l:0x%"PRIx32" IP-core-l:", a->tunend.access.local_teid); OSMO_STRBUF_APPEND(sb, osmo_sockaddr_to_str_buf2, &a->tunend.core.ue_local_addr); break; case UP_GTP_U_TUNMAP: OSMO_STRBUF_PRINTF(sb, "GTP:tunmap GTP-access-r:"); OSMO_STRBUF_APPEND(sb, osmo_sockaddr_to_str_buf2, &a->tunmap.access.gtp_remote_addr); - OSMO_STRBUF_PRINTF(sb, " TEID-access-r:0x%"PRIx32" TEID-access-l:0x%"PRIx32" GTP-core-r:", - a->tunmap.access.remote_teid, a->tunmap.access.local_teid); + OSMO_STRBUF_PRINTF(sb, " TEID-access-r:0x%"PRIx32, a->tunmap.access.remote_teid); + OSMO_STRBUF_PRINTF(sb, " GTP-access-l:"); + OSMO_STRBUF_APPEND(sb, osmo_sockaddr_to_str_buf2, &a->tunmap.access.gtp_local_addr); + OSMO_STRBUF_PRINTF(sb, " TEID-access-l:0x%"PRIx32, a->tunmap.access.local_teid); + OSMO_STRBUF_PRINTF(sb, " GTP-core-r:"); OSMO_STRBUF_APPEND(sb, osmo_sockaddr_to_str_buf2, &a->tunmap.core.gtp_remote_addr); - OSMO_STRBUF_PRINTF(sb, " TEID-core-r:0x%"PRIx32" TEID-core-l:0x%"PRIx32, - a->tunmap.core.remote_teid, a->tunmap.core.local_teid); + OSMO_STRBUF_PRINTF(sb, " TEID-core-r:0x%"PRIx32, a->tunmap.core.remote_teid); + OSMO_STRBUF_PRINTF(sb, " GTP-core-l:"); + OSMO_STRBUF_APPEND(sb, osmo_sockaddr_to_str_buf2, &a->tunmap.core.gtp_local_addr); + OSMO_STRBUF_PRINTF(sb, " TEID-core-l:0x%"PRIx32, a->tunmap.core.local_teid); break; case UP_GTP_DROP: OSMO_STRBUF_PRINTF(sb, "GTP:drop"); diff --git a/src/osmo-upf/up_session.c b/src/osmo-upf/up_session.c index fe3d359..fae4c1e 100644 --- a/src/osmo-upf/up_session.c +++ b/src/osmo-upf/up_session.c @@ -1214,9 +1214,10 @@ .kind = UP_GTP_U_TUNEND, .tunend = { .access = { + .gtp_local_addr = pdr->local_f_teid->fixed.ip_addr.v4, .local_teid = pdr->local_f_teid->fixed.teid, - .remote_teid = rfar_forw->outer_header_creation.teid, .gtp_remote_addr = rfar_forw->outer_header_creation.ip_addr.v4, + .remote_teid = rfar_forw->outer_header_creation.teid, }, .core = { .ue_local_addr = rpdr->desc.pdi.ue_ip_address.ip_addr.v4, @@ -1323,14 +1324,16 @@ .kind = UP_GTP_U_TUNMAP, .tunmap = { .access = { + .gtp_local_addr = pdr->local_f_teid->fixed.ip_addr.v4, .local_teid = pdr->local_f_teid->fixed.teid, - .remote_teid = rfar_forw->outer_header_creation.teid, .gtp_remote_addr = rfar_forw->outer_header_creation.ip_addr.v4, + .remote_teid = rfar_forw->outer_header_creation.teid, }, .core = { + .gtp_local_addr = rpdr->local_f_teid->fixed.ip_addr.v4, .local_teid = rpdr->local_f_teid->fixed.teid, - .remote_teid = far_forw->outer_header_creation.teid, .gtp_remote_addr = far_forw->outer_header_creation.ip_addr.v4, + .remote_teid = far_forw->outer_header_creation.teid, }, }, };