Paging (F1AP): add F1 paging library (9.2.6.1 3GPP TS 38.473)

Add F1AP Paging library and new message type to follow the existing F1AP
library pattern and to support multi-cell paging and both RAN UE (I-RNTI)
and CN UE (5G-S-TMSI) paging identities at the library level per TS 38.473.

* New library (f1ap_paging.c/h, f1ap_lib_includes.h, CMakeLists.txt)
  - Implement encode/decode/copy/eq/free for F1AP Paging (procedure 9.2.6).
  - Add ASN.1 includes for Paging, PagingIdentity, CN/RAN UE identities.
  - Enables unit testing of Paging enc/dec in f1ap_lib_test.c.

* New types in f1ap_messages_types.h (existing f1ap_paging_ind_t unchanged)
  - f1ap_paging_t: UE Identity Index, paging identity (union + type enum),
    optional paging_drx, paging_priority, paging_origin, and paging_cells[].
  - f1ap_paging_cell_item_t, f1ap_paging_identity_type_t, f1ap_paging_identity_t
    for multi-cell list and RAN/CN identity discrimination.
  - Paging Origin IE is optional per F1AP 8.7.1.2.

Tests: test_f1ap_paging() roundtrip and copy for CN UE (5G-S-TMSI) and
RAN UE (I-RNTI) cases, with optional IEs.
This commit is contained in:
Guido Casati
2026-02-17 12:25:58 +01:00
parent b026e6b4ee
commit 08f0f9369c
7 changed files with 541 additions and 0 deletions
+63
View File
@@ -24,6 +24,7 @@
#include <netinet/in.h>
#include <netinet/sctp.h>
#include <stdbool.h>
#include "common/5g_platform_types.h"
#include "common/platform_constants.h"
#include "common/utils/ds/byte_array.h"
@@ -640,6 +641,68 @@ typedef struct f1ap_paging_ind_s {
uint8_t paging_drx;
} f1ap_paging_ind_t;
typedef struct f1ap_paging_cell_item_s {
plmn_id_t plmn;
uint64_t nr_cellid;
} f1ap_paging_cell_item_t;
typedef enum f1ap_paging_identity_type_e {
F1AP_PAGING_IDENTITY_RAN_UE, // RAN UE Paging Identity (I-RNTI)
F1AP_PAGING_IDENTITY_CN_UE // CN UE Paging Identity (5G-S-TMSI)
} f1ap_paging_identity_type_t;
typedef union f1ap_paging_identity_u {
// RAN UE Paging Identity (I-RNTI)
uint64_t ran_ue_paging_identity;
// CN UE Paging Identity (5G-S-TMSI)
uint64_t cn_ue_paging_identity;
} f1ap_paging_identity_t;
/** @brief Paging DRX (9.3.1.40 TS 38.473)
* This IE indicates the Paging DRX as defined in
* TS 38.304. Unit in radio frames.*/
typedef enum f1ap_paging_drx_e {
F1AP_PAGING_DRX_32 = 0,
F1AP_PAGING_DRX_64 = 1,
F1AP_PAGING_DRX_128 = 2,
F1AP_PAGING_DRX_256 = 3
} f1ap_paging_drx_t;
/** @brief Paging Priority (9.3.1.41 TS 38.473)
* Lower value codepoint indicates higher priority.
* codepoint indicates higher priority.*/
typedef enum f1ap_paging_priority_e {
F1AP_PAGING_PRIO_LEVEL1 = 0,
F1AP_PAGING_PRIO_LEVEL2 = 1,
F1AP_PAGING_PRIO_LEVEL3 = 2,
F1AP_PAGING_PRIO_LEVEL4 = 3,
F1AP_PAGING_PRIO_LEVEL5 = 4,
F1AP_PAGING_PRIO_LEVEL6 = 5,
F1AP_PAGING_PRIO_LEVEL7 = 6,
F1AP_PAGING_PRIO_LEVEL8 = 7
} f1ap_paging_priority_t;
typedef bool f1ap_paging_origin_t;
#define F1AP_PAGING_ORIGIN_NON_3GPP true
/* 9.2.6.1 Paging (3GPP TS 38.473) */
typedef struct {
// UE Identity Index value (mandatory)
uint16_t ue_identity_index_value;
// Paging Identity (mandatory)
f1ap_paging_identity_type_t identity_type;
f1ap_paging_identity_t identity;
// Paging DRX: 0 (32), 1 (64), 2 (128), 3 (256) (optional)
f1ap_paging_drx_t *drx;
// Paging priority (optional)
f1ap_paging_priority_t *priority;
// Paging origin (optional)
f1ap_paging_origin_t *origin;
// Paging Cell List (mandatory); max 512 cells
uint16_t n_cells;
f1ap_paging_cell_item_t *cells;
} f1ap_paging_t;
typedef struct f1ap_lost_connection_t {
int dummy;
} f1ap_lost_connection_t;