From f6a9eec8bd4d5c6ef468e381674ab6b262e9db24 Mon Sep 17 00:00:00 2001
From: Chieh-Chun Chen <chenc80348@gmail.com>
Date: Wed, 5 Oct 2022 17:16:42 +0200
Subject: [PATCH] Add ran func for GTP SM

---
 executables/nr-softmodem.c | 49 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 48 insertions(+), 1 deletion(-)

diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index b61273523a..c324793fd0 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -95,6 +95,7 @@ unsigned short config_frames[4] = {2,9,11,13};
 #include "openair2/LAYER2/nr_pdcp/nr_pdcp.h"
 #include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
 #include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
+#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
 #include <time.h>
 
 //////////////////////////////////
@@ -830,7 +831,6 @@ void read_rlc_sm(rlc_ind_msg_t* data)
   }
 }
 
-
 static
 void read_pdcp_sm(pdcp_ind_msg_t* data)
 {
@@ -890,6 +890,50 @@ void read_pdcp_sm(pdcp_ind_msg_t* data)
   }
 }
 
+static
+void read_gtp_sm(gtp_ind_msg_t* data)
+{
+  assert(data != NULL);
+
+  data->tstamp = time_now_us();
+
+  NR_UEs_t *UE_info = &RC.nrmac[mod_id]->UE_info;
+  size_t num_ues = 0;
+  UE_iterator(UE_info->list, ue) {
+    if (ue)
+      num_ues += 1;
+  }
+
+  data->len = num_ues;
+  if(data->len > 0){
+    data->ngut = calloc(data->len, sizeof(gtp_ngu_t_stats_t) );
+    assert(data->ngut != NULL);
+  }
+
+  size_t i = 0;
+  UE_iterator(UE_info->list, UE)
+  {
+    uint16_t const rnti = UE->rnti;
+    struct rrc_gNB_ue_context_s *ue_context_p = NULL;
+    ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[mod_id], rnti);
+    if (ue_context_p != NULL) {
+      int nb_pdu_session = ue_context_p->ue_context.setup_pdu_sessions - 1;
+      data->ngut[i].rnti = ue_context_p->ue_context.rnti;
+      data->ngut[i].teidgnb = ue_context_p->ue_context.pduSession[nb_pdu_session].param.gtp_teid;
+      // TODO: one PDU session has multiple QoS Flow
+      int nb_qos_flow = ue_context_p->ue_context.pduSession[nb_pdu_session].param.nb_qos -1;
+      data->ngut[i].qfi = ue_context_p->ue_context.pduSession[nb_pdu_session].param.qos[nb_qos_flow].qfi;
+      // TODO: not sure for the upf tunnel id
+      data->ngut[i].teidupf = ue_context_p->ue_context.gnb_gtp_teid[0];
+    } else {
+      LOG_W(NR_RRC,"rrc_gNB_get_ue_context return NULL\n");
+      if (data->ngut != NULL) free(data->ngut);
+    }
+    i++;
+  }
+
+}
+
 static
 void read_kpm_sm(kpm_ind_data_t* data)
 {
@@ -1053,6 +1097,7 @@ void read_RAN(sm_ag_if_rd_t* data)
   assert(data->type == MAC_STATS_V0
         || data->type == RLC_STATS_V0
         || data->type == PDCP_STATS_V0
+        || data->type == GTP_STATS_V0
         || data->type == KPM_STATS_V0
         );
 
@@ -1062,6 +1107,8 @@ void read_RAN(sm_ag_if_rd_t* data)
     read_rlc_sm(&data->rlc_stats.msg);
   } else if(data->type == PDCP_STATS_V0){
     read_pdcp_sm(&data->pdcp_stats.msg);
+  } else if(data->type == GTP_STATS_V0){
+    read_gtp_sm(&data->gtp_stats.msg);
   } else if(data->type == KPM_STATS_V0){
     read_kpm_sm(&data->kpm_stats);
   } else {
-- 
GitLab