neels has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-upf/+/30459
)
Change subject: VTY 'show gtp': more accurately identify local/remote IP
......................................................................
VTY 'show gtp': more accurately identify local/remote IP
Indicate whether a shown IP address is local or remote, by adding '-l'
or '-r' to the field names shown.
So far, osmo-upf is only tracking remote GTP addrs, but we are about to
implement choosing local GTP addrs by Network Instance IEs. Those should
also be shown and will need to be set apart from the remote addresses.
Related: I440466f1cc9689391869ac2579a4497ef6008adb (osmo-ttcn3-hacks)
Change-Id: Ic539ebe84a0853f665e5b8b8489dd587e6907287
---
M include/osmocom/upf/up_gtp_action.h
M include/osmocom/upf/up_session.h
M include/osmocom/upf/upf_gtp.h
M src/osmo-upf/up_gtp_action.c
M src/osmo-upf/up_session.c
M src/osmo-upf/upf_gtp.c
6 files changed, 68 insertions(+), 41 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-upf refs/changes/59/30459/1
diff --git a/include/osmocom/upf/up_gtp_action.h b/include/osmocom/upf/up_gtp_action.h
index 8e291b7..416910a 100644
--- a/include/osmocom/upf/up_gtp_action.h
+++ b/include/osmocom/upf/up_gtp_action.h
@@ -48,8 +48,8 @@
struct llist_head entry;
struct up_session *session;
- uint16_t pdr_core;
uint16_t pdr_access;
+ uint16_t pdr_core;
enum up_gtp_action_kind kind;
union {
diff --git a/include/osmocom/upf/up_session.h b/include/osmocom/upf/up_session.h
index e201954..10cc9ff 100644
--- a/include/osmocom/upf/up_session.h
+++ b/include/osmocom/upf/up_session.h
@@ -54,10 +54,14 @@
struct osmo_use_count use_count;
struct osmo_use_count_entry use_count_buf[8];
+ /* llist of struct pdr */
struct llist_head pdrs;
+ /* llist of struct far */
struct llist_head fars;
+ /* llist of struct chosen_f_teid */
struct llist_head chosen_f_teids;
+ /* llist of struct up_gtp_action */
struct llist_head active_gtp_actions;
};
diff --git a/include/osmocom/upf/upf_gtp.h b/include/osmocom/upf/upf_gtp.h
index 77ea623..da04ee6 100644
--- a/include/osmocom/upf/upf_gtp.h
+++ b/include/osmocom/upf/upf_gtp.h
@@ -57,14 +57,21 @@
uint32_t ifidx;
+ /* list of struct upf_gtp_tunend */
struct llist_head tunnels;
};
+/* Description of a GTP encapsulation / decapsulation.
+ * The active state to operate the GTP kernel module accordingly is kept in struct
upf_gtp_tunend. */
struct upf_gtp_tunend_desc {
- uint32_t local_teid;
- uint32_t remote_teid;
- struct osmo_sockaddr ue_addr;
- struct osmo_sockaddr gtp_remote_addr;
+ struct {
+ uint32_t local_teid;
+ uint32_t remote_teid;
+ struct osmo_sockaddr gtp_remote_addr;
+ } access;
+ struct {
+ struct osmo_sockaddr ue_local_addr;
+ } core;
};
int upf_gtp_tunend_desc_cmp(const struct upf_gtp_tunend_desc *a, const struct
upf_gtp_tunend_desc *b);
diff --git a/src/osmo-upf/up_gtp_action.c b/src/osmo-upf/up_gtp_action.c
index a8a864b..09abd36 100644
--- a/src/osmo-upf/up_gtp_action.c
+++ b/src/osmo-upf/up_gtp_action.c
@@ -48,14 +48,14 @@
switch (a->kind) {
case UP_GTP_U_TUNEND:
- if ((cmp = CMP_MEMB(tunend.local_teid)))
+ if ((cmp = CMP_MEMB(tunend.access.local_teid)))
return cmp;
- if ((cmp = CMP_MEMB(tunend.remote_teid)))
+ if ((cmp = CMP_MEMB(tunend.access.remote_teid)))
return cmp;
- cmp = osmo_sockaddr_cmp(&a->tunend.gtp_remote_addr,
&b->tunend.gtp_remote_addr);
+ cmp = osmo_sockaddr_cmp(&a->tunend.access.gtp_remote_addr,
&b->tunend.access.gtp_remote_addr);
if (cmp)
return cmp;
- cmp = osmo_sockaddr_cmp(&a->tunend.ue_addr, &b->tunend.ue_addr);
+ cmp = osmo_sockaddr_cmp(&a->tunend.core.ue_local_addr,
&b->tunend.core.ue_local_addr);
if (cmp)
return cmp;
break;
@@ -166,16 +166,16 @@
struct osmo_strbuf sb = { .buf = buf, .len = buflen };
switch (a->kind) {
case UP_GTP_U_TUNEND:
- OSMO_STRBUF_PRINTF(sb, "GTP:tunend GTP-access:");
- OSMO_STRBUF_APPEND(sb, osmo_sockaddr_to_str_buf2, &a->tunend.gtp_remote_addr);
- OSMO_STRBUF_PRINTF(sb, " TEID-r:0x%"PRIx32" TEID-l:0x%"PRIx32"
IP-core:",
- a->tunend.remote_teid, a->tunend.local_teid);
- OSMO_STRBUF_APPEND(sb, osmo_sockaddr_to_str_buf2, &a->tunend.ue_addr);
+ 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_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:");
+ 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:",
+ 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_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,
diff --git a/src/osmo-upf/up_session.c b/src/osmo-upf/up_session.c
index 157f0c3..273c3fe 100644
--- a/src/osmo-upf/up_session.c
+++ b/src/osmo-upf/up_session.c
@@ -116,7 +116,8 @@
/* Choose an F-TEID (when the peer has sent CHOOSE = 1).
* If the peer also sent a CHOOSE_ID, then remember this F-TEID choice under the given
ID, and re-use that choice when
- * the same ID re-appears. The chosen IDs are saved in session->chosen_f_teids. */
+ * the same ID re-appears. The chosen IDs are saved in session->chosen_f_teids.
+ * Return 0 on success, or an OSMO_PFCP_CAUSE_* value on failure. */
static enum osmo_pfcp_cause up_session_choose_f_teid(struct up_session *session, struct
osmo_pfcp_ie_f_teid *dst,
bool choose_id_present, uint8_t choose_id)
{
@@ -312,6 +313,7 @@
pdr->far = far;
}
+/* Set up a new Packet Detection Rule, append the response to the end of the
created_pdr/created_pdr_count array. */
static struct pdr *pdr_create(struct up_session *session,
const struct osmo_pfcp_ie_create_pdr *create_pdr,
enum osmo_pfcp_cause *cause,
@@ -1051,6 +1053,7 @@
* The given PDR must have an outer-header-removal and a local F-TEID.
* Its reverse-PDR must have a UE address flagged as "Destination" IP addr.
* Its reverse-PDR's FAR must have an outer-header creation with a remote TEID.
+ * \param pdr A rule detecting packets on Access, where pdr->reverse_pdr detects
packets on Core.
*/
static void add_gtp_action_endecaps(void *ctx, struct llist_head *dst, struct pdr *pdr)
{
@@ -1127,16 +1130,26 @@
.pdr_access = rpdr->desc.pdr_id,
.kind = UP_GTP_U_TUNEND,
.tunend = {
- .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,
- .ue_addr = rpdr->desc.pdi.ue_ip_address.ip_addr.v4,
+ .access = {
+ .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,
+ },
+ .core = {
+ .ue_local_addr = rpdr->desc.pdi.ue_ip_address.ip_addr.v4,
+ },
},
};
llist_add_tail(&a->entry, dst);
}
+/* A GTP tunnel on Access side, TODO TODO TODO plain IP on Core side.
+ * The given PDR must have an outer-header-removal and a local F-TEID.
+ * Its reverse-PDR must have a UE address flagged as "Destination" IP addr.
+ * Its reverse-PDR's FAR must have an outer-header creation with a remote TEID.
+ * \param pdr A rule detecting packets on Access, where pdr->reverse_pdr detects
packets on Core.
+ */
static void add_gtp_action_forw(void *ctx, struct llist_head *dst, struct pdr *pdr)
{
struct up_session *session = pdr->session;
@@ -1226,16 +1239,16 @@
.pdr_access = rpdr->desc.pdr_id,
.kind = UP_GTP_U_TUNMAP,
.tunmap = {
- .core = {
- .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,
- },
.access = {
.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,
},
+ .core = {
+ .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,
+ },
},
};
@@ -1267,7 +1280,8 @@
continue;
/* In this outer loop, only follow the forw_to_core directed PDRs, in the inner loop
find the matching
- * forw_from_core PDR. */
+ * forw_from_core PDR. i.e. we are looking only at PDRs detecting packets on the Access
side, pairing up
+ * with "reverse PDRs" detecting packets on the Core side. */
if (!pdr->forw_to_core)
continue;
diff --git a/src/osmo-upf/upf_gtp.c b/src/osmo-upf/upf_gtp.c
index ae1eaf0..f04dad1 100644
--- a/src/osmo-upf/upf_gtp.c
+++ b/src/osmo-upf/upf_gtp.c
@@ -298,12 +298,13 @@
static int upf_gtp_tunend_to_str_buf(char *buf, size_t buflen, const struct
upf_gtp_tunend *tun)
{
struct osmo_strbuf sb = { .buf = buf, .len = buflen };
- OSMO_STRBUF_PRINTF(sb, "%s:tun{TEID=l:0x%x,r:0x%x UE=", tun->dev->name,
tun->desc.local_teid,
- tun->desc.remote_teid);
- OSMO_STRBUF_APPEND(sb, osmo_sockaddr_to_str_buf2, &tun->desc.ue_addr);
- OSMO_STRBUF_PRINTF(sb, " GTP-dst=");
- OSMO_STRBUF_APPEND(sb, osmo_sockaddr_to_str_buf2, &tun->desc.gtp_remote_addr);
- OSMO_STRBUF_PRINTF(sb, "}");
+ /* "tunend{dev=apn0 access(GTP-r=1.2.3.4 TEID:l=0x1234,r=0x5678)
core(UE-l=10.9.8.7)}" */
+ OSMO_STRBUF_PRINTF(sb, "tunend{dev=%s access(GTP-r=", tun->dev->name);
+ OSMO_STRBUF_APPEND(sb, osmo_sockaddr_to_str_buf2,
&tun->desc.access.gtp_remote_addr);
+ OSMO_STRBUF_PRINTF(sb, " TEID:l=0x%x,r=0x%x) core(UE-l=",
+ tun->desc.access.local_teid, tun->desc.access.remote_teid);
+ OSMO_STRBUF_APPEND(sb, osmo_sockaddr_to_str_buf2,
&tun->desc.core.ue_local_addr);
+ OSMO_STRBUF_PRINTF(sb, ")}");
return sb.chars_needed;
}
@@ -339,7 +340,8 @@
{
struct gtp_tunnel *t;
- if (tun->desc.ue_addr.u.sas.ss_family != AF_INET ||
tun->desc.gtp_remote_addr.u.sas.ss_family != AF_INET) {
+ if (tun->desc.core.ue_local_addr.u.sas.ss_family != AF_INET
+ || tun->desc.access.gtp_remote_addr.u.sas.ss_family != AF_INET) {
LOG_GTP_TUN(tun, LOGL_ERROR, "Only capabale of IPv4\n");
return NULL;
}
@@ -348,10 +350,10 @@
OSMO_ASSERT(t);
gtp_tunnel_set_ifidx(t, tun->dev->ifidx);
gtp_tunnel_set_version(t, GTP_V1);
- gtp_tunnel_set_i_tei(t, tun->desc.local_teid);
- gtp_tunnel_set_o_tei(t, tun->desc.remote_teid);
- gtp_tunnel_set_ms_ip4(t, &tun->desc.ue_addr.u.sin.sin_addr);
- gtp_tunnel_set_sgsn_ip4(t, &tun->desc.gtp_remote_addr.u.sin.sin_addr);
+ gtp_tunnel_set_i_tei(t, tun->desc.access.local_teid);
+ gtp_tunnel_set_o_tei(t, tun->desc.access.remote_teid);
+ gtp_tunnel_set_sgsn_ip4(t, &tun->desc.access.gtp_remote_addr.u.sin.sin_addr);
+ gtp_tunnel_set_ms_ip4(t, &tun->desc.core.ue_local_addr.u.sin.sin_addr);
return t;
}
@@ -470,9 +472,9 @@
return 1;
#define CMP_MEMB(MEMB) OSMO_CMP(a->MEMB, b->MEMB)
- if ((r = CMP_MEMB(local_teid)))
+ if ((r = CMP_MEMB(access.local_teid)))
return r;
- if ((r = CMP_MEMB(remote_teid)))
+ if ((r = CMP_MEMB(access.remote_teid)))
return r;
- return osmo_sockaddr_cmp(&a->gtp_remote_addr, &b->gtp_remote_addr);
+ return osmo_sockaddr_cmp(&a->access.gtp_remote_addr,
&b->access.gtp_remote_addr);
}
--
To view, visit
https://gerrit.osmocom.org/c/osmo-upf/+/30459
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-upf
Gerrit-Branch: master
Gerrit-Change-Id: Ic539ebe84a0853f665e5b8b8489dd587e6907287
Gerrit-Change-Number: 30459
Gerrit-PatchSet: 1
Gerrit-Owner: neels <nhofmeyr(a)sysmocom.de>
Gerrit-MessageType: newchange